以前可以写出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();