标签:
首先需清楚Socket类提供了getInputStream()方法和getOutputStream()方法,分别返回输入流InputStream对象和输出流OutputStream对象。程序只需向数据流写数据,就能向对方发送数据;只需从输入流读数据,就能接收来自对方的数据。
创建服务器程序DemoServer01
public class DemoServer01 { /** * @author 牧羊的伯格女皇 11/12 * @param args * 创建服务端与客户端之间的相互通信 */ private int port = 9999; private ServerSocket server; public static void main(String[] args) { new DemoServer01().serverTalk(); } public DemoServer01(){ try { server =new ServerSocket(9999); System.out.println("服务器启动且监听了端口: " + server.getLocalPort() ); } catch (IOException e) { e.printStackTrace(); } } //输出流 public PrintWriter getWriter(Socket socket) throws IOException{ OutputStream outSocket = socket.getOutputStream(); //参数true表示每写一行,PrintWriter缓存就自动溢出,把数据写到目的地. return new PrintWriter( outSocket, true ); } // 输入流 public BufferedReader getReader(Socket socket) throws IOException{ InputStream inSocket = socket.getInputStream(); // 参数 Reader //参数 InputStream return new BufferedReader( new InputStreamReader( inSocket ) ); } public void serverTalk(){ Socket socket = null; try { socket = server.accept(); //一直侦听等待客户的连接 PrintWriter pw = getWriter(socket); BufferedReader br = getReader(socket); BufferedReader localReader = new BufferedReader( new InputStreamReader( System.in ) ); String msg = null; while(true){ while( (msg = br.readLine() ) != null ){ System.out.println("客户端对服务端你说: " + msg); if( msg.equals("bye")){ System.out.println("客户端主动断开了与您的连接."); break; } System.out.print("服务端对客户端说: " ); String inString = localReader.readLine(); pw.println( inString ); if( inString.equals("bye")){ System.out.println("服务端断开了与客户端 " + socket.getInetAddress() +" 的连接"); break; } } } } catch (Exception e) { e.printStackTrace(); }finally{ if( socket != null ){ try { socket.close(); } catch (IOException e) { e.printStackTrace(); } } } } }
对于服务器程序,其中最主要的方法还是为serverTalk()方法,它不断等待客户的连接请求,server.accept()方法返回一个Socket对象时,就意味着与一个客户建立了连接。接下来从Socket对象中得到输出流和输入流,并且分贝用PrintWriter和BufferedReader来装饰他们。然后不断调用BufferedReader 的 readLine()方法读取客户发来的字符串,在调用PrintWriter的println()方法向客户返回字符串。如果为“bye”,则结束通信,调用socket.close()方法断开连接。
3.创建客户程序DemoClient01
public class DemoClient01 { private String host = "localhost"; private int port = 9999; private Socket socket; public static void main(String[] args) { new DemoClient01().clientTalk(); } public DemoClient01(){ try{ socket = new Socket(host,port); //创建socket对象 System.out.println("客户端已连接到服务器..."); }catch (UnknownHostException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } public PrintWriter getWriter(Socket socket) throws IOException{ OutputStream outSocket = socket.getOutputStream(); return new PrintWriter( outSocket,true); } public BufferedReader getReader(Socket socket) throws IOException{ InputStream inSocket = socket.getInputStream(); return new BufferedReader( new InputStreamReader(inSocket) ); } public void clientTalk(){ try { BufferedReader br = getReader(socket); PrintWriter pw = getWriter(socket); BufferedReader localReader = new BufferedReader( new InputStreamReader(System.in) ); String msg = null; System.out.print("客户端对服务端说: "); while( (msg = localReader.readLine() ) != null ){ pw.println(msg); if( msg.equals( "bye" )){ System.out.println("客户端主动断开与服务端的连接."); break; } String readString = br.readLine(); System.out.println("服务端对客户端你说: " + readString ); if( readString.equals( "bye" )){ System.out.println("服务端主动断开了与客户端你的连接."); break; } System.out.print("客户端对服务端说: "); } } catch (UnknownHostException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); }finally{ try { socket.close(); } catch (IOException e) { e.printStackTrace(); } } } }
对于客户程序,其中最主要的是clientTalk()方法、其不断读取用户从控制台输入的字符串,然后把它发送给服务器程序,再把服务器返回的字符串打印到控制台。
Java网络学习笔记1:用(Server)Socket编写简单的客户/服务器程序
标签:
原文地址:http://my.oschina.net/gently/blog/529616