基于TCP实现简单的客户端服务端的消息传递(二)
2016-03-29 14:55
796 查看
上一节学习了TCP与客户端的通讯及数据交互,但是仅限于一次客户端,这一节学习使用线程来模拟多客户端请求一个服务端。
首先看代码:
先看客户端:
Client.java
这里我们模拟了两个客户端
再看看服务端的实现:
server.java:
在这里我们有一个ServerThread的实现,我们也来看看。
ServerThread.java:
首先我们看看运行的效果:
首先我们启动服务端,
然后启动客户端1
服务端控制台:
客户端1控制台:
接下来我们再启动客户端2,再看看效果:
服务端控制台:
客户端2控制台:
首先看代码:
先看客户端:
Client.java
这里我们模拟了两个客户端
package com.socket.tcp; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.PrintWriter; import java.net.Socket; import java.net.UnknownHostException; /** * 客户端 * @author lolli * */ public class Client { public static void main(String[] args) { try { // 实例化一个Socket,请求8888端口 Socket socket = new Socket("localhost", 8888); // 获取一个输出流像服务端发送消息 OutputStream outputStream = socket.getOutputStream(); PrintWriter out = new PrintWriter(outputStream); out.write("我是客户端1"); // 刷新缓存 ,发送请求 out.flush(); socket.shutdownOutput(); // 获取一个输入流,接受服务端的响应 InputStream in = socket.getInputStream(); // 转换成字符流 InputStreamReader inputStreamReader = new InputStreamReader(in); // 放入缓冲流 BufferedReader bufferedReader = new BufferedReader(inputStreamReader); // 获取客户端请求的数据 String str = ""; while((str = bufferedReader.readLine())!=null){ // 打印客户端请求的数据 System.out.println("我是客户端1,服务端说: " + str); } socket.shutdownInput(); // 关闭流 out.close(); outputStream.close(); socket.close(); } catch (UnknownHostException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
package com.socket.tcp; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.PrintWriter; import java.net.Socket; import java.net.UnknownHostException; /** * 客户端 * @author lolli * */ public class Client2 { public static void main(String[] args) { try { // 实例化一个Socket,请求8888端口 Socket socket = new Socket("localhost", 8888); // 获取一个输出流像服务端发送消息 OutputStream outputStream = socket.getOutputStream(); PrintWriter out = new PrintWriter(outputStream); out.write("我是客户端2"); // 刷新缓存 ,发送请求 out.flush(); socket.shutdownOutput(); // 获取一个输入流,接受服务端的响应 InputStream in = socket.getInputStream(); // 转换成字符流 InputStreamReader inputStreamReader = new InputStreamReader(in); // 放入缓冲流 BufferedReader bufferedReader = new BufferedReader(inputStreamReader); // 获取客户端请求的数据 String str = ""; while((str = bufferedReader.readLine())!=null){ // 打印客户端请求的数据 System.out.println("我是客户端2,服务端说: " + str); } socket.shutdownInput(); // 关闭流 out.close(); outputStream.close(); socket.close(); } catch (UnknownHostException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
再看看服务端的实现:
server.java:
package com.socket.tcp; import java.io.IOException; import java.net.InetAddress; import java.net.ServerSocket; import java.net.Socket; /** * 服务端 * @author lolli * */ public class Server { public static void main(String[] args) { try { // 实例化一个ServerSocket,监听8888端口 ServerSocket serverSocket = new ServerSocket(8888); System.out.println("***** 启动服务器,等待客户端的连接请求 ******"); int clientCount = 0; while(true){ Socket socket = serverSocket.accept(); // 获取一个服务端线程 ServerThread serverThread = new ServerThread(socket); // 启动线程 serverThread.start(); clientCount ++ ; System.out.println("当前连接服务端的客户端数量:" + clientCount); InetAddress inetAddress = socket.getInetAddress(); System.out.println("当前连接的计算机名:" + inetAddress.getHostName()); } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
在这里我们有一个ServerThread的实现,我们也来看看。
ServerThread.java:
package com.socket.tcp; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.PrintWriter; import java.net.Socket; /** * 服务端线程类 * @author lolli * */ public class ServerThread extends Thread{ private Socket socket = null; // 有参构造 public ServerThread(Socket socket){ this.socket = socket; } @Override public void run() { InputStream in = null; InputStreamReader inputStreamReader = null; BufferedReader bufferedReader = null; OutputStream outputStream = null; PrintWriter out = null; try { // 接收输入流(字节流) in = socket.getInputStream(); // 转换成字符流 inputStreamReader = new InputStreamReader(in); // 放入缓冲流 bufferedReader = new BufferedReader(inputStreamReader); // 获取客户端请求的数据 String str = ""; String data = ""; while((str = bufferedReader.readLine())!=null){ // 打印客户端请求的数据 System.out.println("我是服务端,客户端说: " + str); data = str; } // 接收到客户端请求的数据后相应客户端 outputStream = socket.getOutputStream(); out = new PrintWriter(outputStream); out.write("接收到了客户端传递的数据,数据为:‘" + data + "’"); out.flush(); socket.shutdownInput(); socket.shutdownOutput(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { // 关闭流 try { if (bufferedReader!=null) bufferedReader.close(); if (inputStreamReader!=null) inputStreamReader.close(); if (in!=null) in.close(); if (socket!=null) socket.close(); if (out!=null) out.close(); if (outputStream!=null) outputStream.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }
首先我们看看运行的效果:
首先我们启动服务端,
然后启动客户端1
服务端控制台:
客户端1控制台:
接下来我们再启动客户端2,再看看效果:
服务端控制台:
客户端2控制台:
相关文章推荐
- 优化网络请求
- httpclient4.5 例子
- iOS之 HTTP、Socket、TCP的区别(易混
- http状态码
- android通过网络访问adb
- ios开发--tcp/ip
- android 判断网络是否可用
- Windows系统下的TCP参数优化(注册表\TCPIP\Parameters)
- socketserver — 网络服务器的框架
- Android XUtils3.0 Http网络请求的介绍
- Connection to https://dl-ssl.google.com refused的解决办法
- 卷积神经网络解析
- TCP/IP和Socket的关系
- 【JAVA开发之IO流1-4】IO流之数据流与网络传输基础
- 使用HttpUnit进行集成测试
- IOCP模型与网络编程
- Android之网络编程
- iOS 对网络视频采集视频截图
- Android 每次访问网络时,都需要判断是否有网络
- 基于Boa-web服务器的远程机器人控制(网络篇)