以前可以写出Java Socket通信的代码,但是一个偶然的机会发现自己写的代码实在是太蠢了。我居然每发一段数据都会关掉原有的Socket重新开启一个Socket,这种方式实在是太浪费资源。一个偶然的机会,我结合网络的基础知识和自己写的代码仔细推敲了下,发现了其中的问题。
首先,利用ServerSocket和Socket进行TCP通信时,服务器端利用构造函数申明ServerSocket会绑定一个端口号,然后阻塞在.accept()方法中,客户端的Socket连接到这个端口号时,服务器端也会形成一个相应的Socket。而这一对Socket就是这一次通信的Socket,接下来的事就像对I/O读写一样来操作Socket即可。当不需要使用时进行关闭。下一次需要通信时,可以再开一个Socket。不知道还有没有人和我一样从前以为发一串数据,就得重新开一个Socket。
服务器端代码:
public class Server extends Thread{ Socket socket=null; BufferedReader read=null; @Override public void run() { try { ServerSocket server=new ServerSocket(7777); socket=server.accept(); read=new BufferedReader(new InputStreamReader(socket.getInputStream())); while(true) { String content=""; String line=""; content=read.readLine(); if(!content.equals("")) System.out.println("客户端:"+content); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } } catch (IOException e) { e.printStackTrace(); } } public static void main(String[] arg) { Server server=new Server(); server.start(); }}
客户端代码:
public class Client extends Thread{ Socket client=null; BufferedWriter write=null; BufferedReader read=null; @Override public void run() { // TODO Auto-generated method stub try { client=new Socket("127.0.0.1",7777); write=new BufferedWriter(new OutputStreamWriter(client.getOutputStream())); read=new BufferedReader(new InputStreamReader(System.in)); while(true) { String s=read.readLine(); write.write(s); write.newLine(); write.flush(); } } catch (UnknownHostException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } public static void main(String[] arg) { Client client=new Client(); client.start(); }}
这个服务器端代码和客户端代码完成的功能是在客户端输入,服务器端显示的功能。
值得注意的地方是:
代码中对Socket的读写需要成套使用,如果在客户端采用
BufferedWriter write=new BufferedWriter(new OutputStreamWriter(client.getOutputStream()));write.write(s);write.newLine();write.flush();
那么服务器端需要采用:
BufferedReader read=new BufferedReader(new InputStreamReader(socket.getInputStream()));String content=read.readLine();
还有另一种读写方式:
//客户端DataOutputStream write=new DataOutputStream(client.getOutputStream());write.writeUTF(s);//服务器端DataInputStream read=new DataInputStream(socket.getInputStream());String content=read.readUTF();
此外,采用PrintStream也是可以的:
PrintStream write=new PrintStream(client.getOutputStream());write.println(s);write.flush();//服务器端DataInputStream read=new DataInputStream(socket.getInputStream());String content=read.readUTF();