首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

黑马软件工程师-java基础之TCP传输客户端与服务端常用代码

2012-09-06 
黑马程序员-java基础之TCP传输客户端与服务端常用代码---------------------- a hrefhttp://edu.csdn.n

黑马程序员-java基础之TCP传输客户端与服务端常用代码
---------------------- <a href="http://edu.csdn.net/heima" target="blank">android培训</a>、<a href="http://edu.csdn.net/heima" target="blank">java培训</a>、期待与您交流! ----------------------

一、TCP传输
 客户端:
1、创建客户端Socket, 指定服务端地址和端口, 连接服务器. 本地地址和端口自动绑定.
Socket socket = new Socket("192.168.1.254", 9999);
 2、获取客户端输入流, 可以读取服务端写出的数据
  InputStream in = socket.getInputStream();
 3、获取客户端输出流, 可以写出数据到服务端
  OutputStream out = socket.getOutputStream();
 4、客户端读取服务端写出的数据. 如果服务端还未写出, 阻塞等待
  byte[] buffer = new byte[1024];
  int len = in.read(buffer);
  String msg = new String(buffer, 0, len);
  System.out.println(msg);
 5、客户端写出数据到服务端
  out.write("我要报名JavaEE就业班!".getBytes());
 6、释放资源
  socket.close();
 服务端:
1、 创建服务端ServerSocket, 绑定指定端口号
ServerSocket serverSocket = new ServerSocket(9999);
2、 阻塞, 服务端等待接收客户端请求
Socket socket = serverSocket.accept();
3、 获取服务端输入流, 可以读取客户端写出的数据
InputStream in = socket.getInputStream();
4、 获取服务端输出流, 可以写出数据到客户端
OutputStream out = socket.getOutputStream();
5、 服务端写出数据到客户端
out.write("欢迎拨打传智播客报名热线, 请问需要什么帮助?".getBytes());
6、 服务端读取客户端写出的数据. 如果客户端还未写出, 阻塞等待.
byte[] buffer = new byte[1024];
int len = in.read(buffer);
String msg = new String(buffer, 0, len);
System.out.println(msg);
 7、释放资源
  socket.close();
  serverSocket.close();
  其实,在客户端释放资源后,服务端也自然就释放资源了。
二、客户端与服务端改进
 客户端:
 Socket socket = new Socket("192.168.1.254", 9999);
 BufferedReader keyBr = new BufferedReader(new InputStreamReader(System.in));
 BufferedReader socketBr;
 socketBr = new BufferedReader(new InputStreamReader(socket.getInputStream()));
 PrintStream ps = new PrintStream(socket.getOutputStream());
 // 从服务端读取一行, 打印
 System.out.println(socketBr.readLine());
 // 从键盘读取一行写出到服务端
 ps.println(keyBr.readLine());
 System.out.println(socketBr.readLine());
 ps.println(keyBr.readLine());
 socket.close();
 服务端:
 Socket socket = serverSocket.accept();
 BufferedReader socketBr;
 socketBr = new BufferedReader(new InputStreamReader(socket.getInputStream()));
 PrintStream ps = new PrintStream(socket.getOutputStream());
 String ip = socket.getInetAddress().getHostAddress();
 int port = socket.getPort();
 ps.println("欢迎拨打传智播客报名热线, 请问需要什么帮助?");
 System.out.println(ip + ":" + port + " " + br.readLine());
 socket.close();
三、多线程TCP传输
 ServerSocket serverSocket = new ServerSocket(9999);
 while (true) {
   final Socket socket = serverSocket.accept(); 
   
   // 循环中每接收到一个客户端请求, 开启一条新线程
   new Thread(){
    public void run() {
     try {
      BufferedReader socketBr;
      socketBr = new BufferedReader(new InputStreamReader(socket.getInputStream()));
      PrintStream ps = new PrintStream(socket.getOutputStream());
      String ip = socket.getInetAddress().getHostAddress();
      int port = socket.getPort();
      ps.println("欢迎拨打传智播客报名热线, 请问需要什么帮助?");
      System.out.println(ip + ":" + port + " " + br.readLine());
      ps.println("报满了, 等下一期吧!");
      System.out.println(ip + ":" + port + " " + br.readLine());
      socket.close();
     } catch (IOException e) {
      e.printStackTrace();
     }
    };
   }.start();
  }
多线程TCP传输就是服务端能够回复多个客户端的请求服务,因此,可用多个线程来回应不同的客户端。
注意close()的作用范围,以免关掉了,再使用不起来了,尤其是在死循环中;如果在多个线程的TCP传输,服务端的Close()关闭流如果放在线程里边,那么一旦一个客户端响应完毕,服务端也相应结束,其它客户端则无法再请求到服务器的响应。但是,请求服务端获取到的客户端的Socket,可以在循环线程内在结束了访问关闭流。

---------------------- <a href="http://edu.csdn.net/heima" target="blank">android培训</a>、<a href="http://edu.csdn.net/heima" target="blank">java培训</a>、期待与您交流! ----------------------

 

1楼lnak47昨天 18:49
fgsdfgsdfgsdf

热点排行