TCP客户端服务器Demo

妖狐艹你老母 2021-12-05 18:09 466阅读 0赞

Client:

  1. import java.io.IOException;
  2. import java.io.InputStream;
  3. import java.io.OutputStream;
  4. import java.net.Socket;
  5. import java.net.UnknownHostException;
  6. import java.util.Scanner;
  7. public class Client extends Thread {
  8. //定义一个Socket对象
  9. Socket socket = null;
  10. public Client(String host, int port) {
  11. try {
  12. //需要服务器的IP地址和端口号,才能获得正确的Socket对象
  13. socket = new Socket(host, port);
  14. } catch (UnknownHostException e) {
  15. e.printStackTrace();
  16. } catch (IOException e) {
  17. e.printStackTrace();
  18. }
  19. }
  20. @Override
  21. public void run() {
  22. //客户端一连接就可以写数据个服务器了
  23. new sendMessThread().start();
  24. super.run();
  25. try {
  26. // 读Sock里面的数据
  27. InputStream s = socket.getInputStream();
  28. byte[] buf = new byte[1024];
  29. int len = 0;
  30. while ((len = s.read(buf)) != -1) {
  31. System.out.println(new String(buf, 0, len));
  32. }
  33. } catch (IOException e) {
  34. e.printStackTrace();
  35. }
  36. }
  37. //往Socket里面写数据,需要新开一个线程
  38. class sendMessThread extends Thread{
  39. @Override
  40. public void run() {
  41. super.run();
  42. //写操作
  43. Scanner scanner=null;
  44. OutputStream os= null;
  45. try {
  46. scanner=new Scanner(System.in);
  47. os= socket.getOutputStream();
  48. String in="";
  49. do {
  50. in=scanner.next();
  51. os.write(("客户端:"+in).getBytes());
  52. os.flush();
  53. } while (!in.equals("bye"));
  54. } catch (IOException e) {
  55. e.printStackTrace();
  56. }
  57. scanner.close();
  58. try {
  59. os.close();
  60. } catch (IOException e) {
  61. e.printStackTrace();
  62. }
  63. }
  64. }
  65. public static void main(String[] args) {
  66. //需要服务器的正确的IP地址和端口号
  67. Client client=new Client("127.0.0.1", 6666);
  68. client.start();
  69. }
  70. }

Sever:

  1. import java.io.IOException;
  2. import java.io.InputStream;
  3. import java.io.OutputStream;
  4. import java.net.ServerSocket;
  5. import java.net.Socket;
  6. import java.util.ArrayList;
  7. import java.util.List;
  8. /** * 可以实现和客户端的相互发送消息的交互 可以是多台电脑 * * */
  9. public class Server2 extends Thread {
  10. // 用来存放连接上的用户的socket对象的值
  11. List<Socket> list = new ArrayList<>();
  12. // 定义服务器接口ServerSocket
  13. ServerSocket server = null;
  14. // 定义一个服务器,定义端口
  15. public Server2(int port) {
  16. try {
  17. server = new ServerSocket(port);
  18. } catch (IOException e) {
  19. e.printStackTrace();
  20. }
  21. }
  22. // 发送消息的线程
  23. @Override
  24. public void run() {
  25. super.run();
  26. try {
  27. while (true) {
  28. // 建立socket接口,accept方法是一个阻塞进程,等到有用户连接才往下走
  29. // 定义Socket类
  30. Socket socket = server.accept();
  31. // 在服务器显示连接的上的电脑、
  32. String message = socket.getInetAddress().getHostAddress().toString();
  33. System.out.println(message+"连接上了");
  34. // 向用户发送消息
  35. SendMessageToAllUser(message);
  36. // 把连接上的用户添加到集合;里面去
  37. list.add(socket);
  38. //开始新连接用户的线程,用于该可以一直读取数据
  39. new readerThread(socket).start();;
  40. }
  41. } catch (IOException e) {
  42. e.printStackTrace();
  43. }
  44. }
  45. // 把消息发送给每一个用户,涉及到写的操作OutStream
  46. private void SendMessageToAllUser(String message) {
  47. // 拿到每一个用户的socket对象,对其进行写入数据
  48. for (Socket socket : list) {
  49. // 判读之前保存的连接是否还在
  50. if (socket != null && socket.isConnected()) {
  51. try {
  52. OutputStream os = socket.getOutputStream();
  53. os.write(message.getBytes());
  54. os.flush();// 刷新一下写入的数据,很有必要
  55. } catch (IOException e) {
  56. e.printStackTrace();
  57. }
  58. }
  59. }
  60. }
  61. // 读取客户端的信息
  62. class readerThread extends Thread {
  63. InputStream is = null;
  64. // 这里传入一个socket对象,因为每一个用户都要用一个不同的线程存放的socket对象来进行一直读取数据
  65. public readerThread(Socket socket) {
  66. try {
  67. System.out.println("服务器在启动中...等待用户的连接");
  68. // 获取输入流
  69. is = socket.getInputStream();
  70. } catch (IOException e) {
  71. e.printStackTrace();
  72. }
  73. }
  74. @Override
  75. public void run() {
  76. super.run();
  77. try {
  78. int len = 0;
  79. byte[] buf = new byte[1024];
  80. while ((len = is.read(buf)) != -1) {
  81. // 把读取到的数据发送给其他用户
  82. SendMessageToAllUser(new String(buf, 0, len));
  83. System.out.println("服务器接收到客户端的数据:"+new String(buf,0,len));
  84. }
  85. } catch (IOException e) {
  86. e.printStackTrace();
  87. }
  88. }
  89. }
  90. public static void main(String[] args) {
  91. //这里服务器只需要定义一个端口号就可以了,IP地址程序会自动获取
  92. //但是客户端需要连接这个服务器时,需要知道它的IP地址还有端口号
  93. //ip地址的查看方法:进入cmd窗口,输入ipconfig/all可以看到
  94. Server2 server=new Server2(6666);
  95. server.start();
  96. }
  97. }

发表评论

表情:
评论列表 (有 0 条评论,466人围观)

还没有评论,来说两句吧...

相关阅读