您的位置:首页 > 编程语言

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里面。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息