风之力科技
股票代码:781340
400-718-5885或13605745691
service@nwpit.com

技术资讯

16Mar2016
点击

Java 利用 Socket 完成数据的以交换实现服务器客户端聊天

    网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket。     


     Socket是网络编程中最基本的通信接口,常用的网络辅助类,比如URL等之类,其底层还是基于Socket来实现的。

   而Socket,形象来说,就是连接通信的两端,比如这样 S<==>S,中间的通道就是网络了,而简单地利用Socket,我们就可以来实现一个简单的聊天功能

  具体效果看下图:

  这只是在本地中试用的效果,如果加上UI界面,其实就可以做成一个聊天的小应用了。

  1. Server 端主要是利用ServerSocket的accept方法来等待客户端的连接,如果客户一直没有连接,则会在这里等待,直到客户端请求到来。

  而客户端就是一个Socket,当客户端请求到来的时候,accept会返回一个Socket对象, 这就是S<==>S中的左边那个S了,可以利用其InputStream和OutputStream来进行读写了,读就是接收信息,而写就是回复信息。

  [java] view plaincopy

  public class Server {

  public static void main(String[] args) {

  try {

  ServerSocket server = new ServerSocket(9999);

  Helper.println("Server started, waiting for message.");

  Socket client = server.accept();

  PrintWriter pw = null;

  while (true) {

  BufferedReader br = new BufferedReader(new InputStreamReader(

  client.getInputStream()));

  String content = br.readLine();

  if (content.equals("end")) {

  server.close();

  br.close();

  if (pw != null) {

  pw.close();

  }

  break;

  }

  Helper.println(content);

  Helper.print("Server:");

  pw = new PrintWriter(client.getOutputStream(), true);

  BufferedReader in = new BufferedReader(new InputStreamReader(System.in));

  String output = "Server : " + in.readLine();

  pw.println(output);

  pw.flush();

  }

  Helper.println("Client left! Server Closed.");

  } catch (IOException e) {

  // TODO Auto-generated catch block

  e.printStackTrace();

  }

  }

  }



 2. Client端就是一个Socket,并定义一个连接的地址和端口,地址表明是网络中哪一台主机,而端口则表明了是主机中的那个应用程序,很显然就是上面Server这个应用,因为其定义了其等待监听的端口就是9999.当创建了一个Socket对象,并指定了地址和端口的时候,其实就已经发送了一个请求去对应的Server,请求连接,而如果连接成功,就可以继续下去,不然直接抛出异常。当然,这里连接成功,必须是Server先在监听了。[java] view plaincopy

  public class Client {

  public static void main(String[] args) {

  try {

  Socket client = new Socket("127.0.0.1", 9999);

  PrintWriter pw = null;

  InputStreamReader isr = null;

  Helper.println("Client started, ready to write content.");

  String input = "";

  while (true) {

  Helper.print("Client : ");

  InputStream is = System.in;

  input = new BufferedReader(new InputStreamReader(is))

  .readLine();

  pw = new PrintWriter(client.getOutputStream(), true);

  pw.println("Client:" + input);

  if (input.equals("end")) {

  client.close();

  is.close();

  pw.close();

  if (isr != null) {

  isr.close();

  }

  break;

  }

  isr = new InputStreamReader(client.getInputStream());

  Helper.println(new BufferedReader(isr)。readLine());

  }

  Helper.println("Client stopped!");

  } catch (IOException e) {

  // TODO Auto-generated catch block

  e.printStackTrace();

  }

  }

  }