Socket编程
2017-08-01 17:51
330 查看
服务器端:
端口号是:0~65535,但是0~1023被系统占用
ServerSocket server = new ServerSocket(40001);
Socket socket = server.accept();//等待客户端的连接
客户端:
Socket socketClient = new Socket("127.0.0.1",40001);//带访问的IP地址,以及端口号 127.0.0.1为默认本地的IP地址
这样客户端就和服务器端建立好了连接。
连接建立好了之后,就是通讯了。
此时的通讯就相当于是文件的读写了。
PrintWriter writer = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())),true);
BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
在客户端的时候:
writer为客户端写给服务器端的信息,reader读取服务器端写给客户端的信息。
而在服务器端,writer为服务器写给客户端的信息,在客户端显示,而reader为客户端写给服务器端的信息,是在服务器端显示、
注意:无论是在客户端还是在服务器端,当连接建立好之后,进行测试,输出生成的socket,观察其结果。
eg:服务器端:System.out.println("Socket:"+socket);
其结果是:Socket:Socket[addr=/127.0.0.1,port=52965,localport=40001]
###########################################################
在客户端:System.out.println("Client_Two socket:"+socket);
其结果是:Client_Two socket:Socket[addr=/127.0.0.1,port=40001,localport=52965]
注意到产生的结果包含对应的IP地址还有两个参数port和localport。同时注意到服务器端和客户端的这两个参数,服务器端的localport是自定义的端口号,而port是自己随机生成的。表示的是客户端的端口号,这个参考客户端的结果可以知道。所以可以明确的解释:
port:通讯对方的端口号
localport:自己的端口号
这个通讯是在TCP/IP的传输层,传输层的数据包的格式是
IP数据标头
TCP/UDP标头 数据
他们的长度什么的暂且不管,IP数据标头里面的信息是:源IP地址和目的IP地址,而TCP/UDP标头里面的信息是:源端口号和目的端口号。
如果要实现多线程,可以把服务器端写成:
ServerSocket server = new ServerSocket(40001);
Socket socket = null;
while(true){
socket = server.accept();
//之后可以把具体的通讯交给线程去处理。
}
注意:
别忘了在最后关掉所用的流。
客户端:
reader.close();
writer.close();
socket.close();
服务器端:
server.close();
注意如果出现了:java.io.IOException: Stream closed
其原因是:代码中把流重复关闭了。比如说是:
try {
str = reader.readLine();
if(str.equals("END")){
writer.close();
reader.close();
socket.close();
break;
}
System.out.println("Client Message:"+str);
writer.println("Server received");
writer.flush();
} catch (IOException e) {
e.printStackTrace();
}finally{
try {
writer.close();
reader.close();
socket.close();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
// TODO Auto-generated catch block
}
如果当读入到的是“END”,把流会再if条件句里面关闭,还会在finally里面关闭,就出现java.io.IOException: Stream closed。
解决方法是:
把finally里面的关闭流的代码写入到catch里面。
端口号是:0~65535,但是0~1023被系统占用
ServerSocket server = new ServerSocket(40001);
Socket socket = server.accept();//等待客户端的连接
客户端:
Socket socketClient = new Socket("127.0.0.1",40001);//带访问的IP地址,以及端口号 127.0.0.1为默认本地的IP地址
这样客户端就和服务器端建立好了连接。
连接建立好了之后,就是通讯了。
此时的通讯就相当于是文件的读写了。
PrintWriter writer = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())),true);
BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
在客户端的时候:
writer为客户端写给服务器端的信息,reader读取服务器端写给客户端的信息。
而在服务器端,writer为服务器写给客户端的信息,在客户端显示,而reader为客户端写给服务器端的信息,是在服务器端显示、
注意:无论是在客户端还是在服务器端,当连接建立好之后,进行测试,输出生成的socket,观察其结果。
eg:服务器端:System.out.println("Socket:"+socket);
其结果是:Socket:Socket[addr=/127.0.0.1,port=52965,localport=40001]
###########################################################
在客户端:System.out.println("Client_Two socket:"+socket);
其结果是:Client_Two socket:Socket[addr=/127.0.0.1,port=40001,localport=52965]
注意到产生的结果包含对应的IP地址还有两个参数port和localport。同时注意到服务器端和客户端的这两个参数,服务器端的localport是自定义的端口号,而port是自己随机生成的。表示的是客户端的端口号,这个参考客户端的结果可以知道。所以可以明确的解释:
port:通讯对方的端口号
localport:自己的端口号
这个通讯是在TCP/IP的传输层,传输层的数据包的格式是
IP数据标头
TCP/UDP标头 数据
他们的长度什么的暂且不管,IP数据标头里面的信息是:源IP地址和目的IP地址,而TCP/UDP标头里面的信息是:源端口号和目的端口号。
如果要实现多线程,可以把服务器端写成:
ServerSocket server = new ServerSocket(40001);
Socket socket = null;
while(true){
socket = server.accept();
//之后可以把具体的通讯交给线程去处理。
}
注意:
别忘了在最后关掉所用的流。
客户端:
reader.close();
writer.close();
socket.close();
服务器端:
server.close();
注意如果出现了:java.io.IOException: Stream closed
其原因是:代码中把流重复关闭了。比如说是:
try {
str = reader.readLine();
if(str.equals("END")){
writer.close();
reader.close();
socket.close();
break;
}
System.out.println("Client Message:"+str);
writer.println("Server received");
writer.flush();
} catch (IOException e) {
e.printStackTrace();
}finally{
try {
writer.close();
reader.close();
socket.close();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
// TODO Auto-generated catch block
}
如果当读入到的是“END”,把流会再if条件句里面关闭,还会在finally里面关闭,就出现java.io.IOException: Stream closed。
解决方法是:
把finally里面的关闭流的代码写入到catch里面。
相关文章推荐
- linux socket编程client获取使用的ip和port
- python的socket编程之udp编程
- c语言socket编程指南 (转)
- 基于tcp的socket编程。
- Linux 网络编程七(非阻塞socket:epoll--select)
- socket编程原理
- socket编程之bind()函数
- socket编程
- 黑马程序员----------Java网络编程(Socket编程)笔记
- 在SOCKET编程中,select()函数的作用
- 最基本的Socket编程 C#版
- 分享:Linux Socket编程(不限Linux)
- Socket编程(TCP)
- Linux系统环境下的Socket编程详细解析
- C# Socket编程笔记【转载】
- 网络socket编程指南 (Beej)
- socket编程
- Java网络socket编程详解
- Socket网络编程--epoll小结
- java socket 编程基础