Socket编程
下图是基于TCP协议的客户机与服务器通信逻辑.客户机使用Socket类型的套接字与服务器会话,服务器则需要使用ServerSocket类型的套接字侦听网络连接,再使用Socket类型的套接字与客户机会话.会话都是通过基于套接字构建的输入流与输出流进行的.
客户端代码:
// TODO Auto-generated method stub
Socket clientSocket=null;
BufferedReader in=null;
BufferedWriter out=null;
try{
clientSocket=new Socket();
SocketAddress remoteAddr=new InetSocketAddress("192.168.52.1",5000);
System.out.println("1.创建客户机套接字成功!");
clientSocket.connect(remoteAddr);//访问服务器指定的地址和端口
System.out.println("2.客户机连接服务器localhost端口5000成功!");
System.out.println("客户机使用的地址端口:"+clientSocket.getLocalSocketAddress());
in=new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
out=new BufferedWriter(new OutputStreamWriter(clientSocket.getOutputStream()));
String sendStr="你好!";
out.write(sendStr);
out.newLine();
out.flush();
System.out.println("3.1向服务器发送字符串成功!"+sendStr);
String revStr=in.readLine();
System.out.println("3.2从服务器接收回送字符串成功!"+revStr);
}catch(IOException e){
System.out.println("异常信息:"+e.getMessage());
}
try{
if(in!=null) in.close();
if(out!=null) out.close();
if(clientSocket!=null) clientSocket.close();
}catch(IOException e){
System.out.println("异常信息:"+e.getMessage());
}
}
服务器代码:
// TODO Auto-generated method stub
BufferedReader in=null;
BufferedWriter out=null;
ServerSocket listenSocket=null;
Socket clientSocket=null;
try {
listenSocket = new ServerSocket();
SocketAddress serverAddr=new InetSocketAddress("192.168.52.1", 5000);
listenSocket.bind(serverAddr);//绑定服务器的工作地址和端口
System.out.println("1.服务器启动成功!开始在localhost的5000端口侦听连接...");
clientSocket=listenSocket.accept();
in=new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
out=new BufferedWriter(new OutputStreamWriter(clientSocket.getOutputStream()));
String recvStr=in.readLine();
System.out.println("3.1服务器收到字符串:"+recvStr);
out.write(recvStr);
out.newLine();
out.flush();
System.out.println("3.2服务器回送字符串成功:"+recvStr);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println("异常信息:"+e.getMessage());
}
//关闭套节字和流
try{
if(in!=null) in.close();
if(out!=null) out.close();
if(listenSocket!=null) listenSocket.close();
if(clientSocket!=null) clientSocket.close();
}catch(IOException e){
System.out.println("异常信息:"+e.getMessage());
}
}
注意:
1.网络编程涉及到图形界面时,一定要将accept函数放到子线程中,避免卡住UI线程
2.readline函数是一个阻塞函数,只有遇到‘\r’或者’\n’才会返回读取的结果