先创建socket对象建立tcp客户端,明确服务端的地址和端口,必须与服务端对应,要不然对方收不到消息,就像快递填错了送货地址。

  1. Socket s = new Socket("127.255.255.25", 10003);

然后建立起连接通道后就会出现socket的IO流,作为客户端我们是发送数据的,我们将数据发送到服务端让它去处理,所以我们获取的也就是OutPutStream,就是将数据写给服务端

  1. OutputStream out = s.getOutputStream();

然后剩下的就是给服务端写数据了,这些操作其实就和IO流那块一样了,比如我们下面这样

  1. out.write("hello,TCP来了".getBytes());

最后一定记得关闭socket资源

  1. import java.io.IOException;
  2. import java.io.OutputStream;
  3. import java.net.Socket;
  4. public class TcpClient {
  5. public static void main(String[] args) throws IOException, IOException {
  6. System.out.println("客户端运行。。。");
  7. /**
  8. * 需求:通过tcp传输数据发送给服务器
  9. * 思路:
  10. * 1、建立tcp客户端socket.明确服务端的地址和端口
  11. * 2、如果通道建立成功就会出现socket io流
  12. * 客户端需要做的就是获取socket流中输出流将数据发送目的地服务端
  13. * 3、通过socket输出流将数据发送
  14. * 4、关闭
  15. */
  16. //1、建立tcp客户端socket.明确服务端的地址和端口
  17. Socket s = new Socket("127.255.255.25", 10003);
  18. //2、如果通道建立成功就会出现socket io流 客户端需要做的就是获取socket流中输出流将数据发送目的地服务端
  19. //3、通过socket输出流将数据发送
  20. OutputStream out = s.getOutputStream();
  21. out.write("hello,TCP来了".getBytes());
  22. //4、关闭
  23. s.close();
  24. }
  25. }

当你给服务端发送完数据后,有可能服务端还会给你回复一些数据,这时候在客户端还需要去接收服务端发送来的数据,只需要

  1. InputStream in = s.getInputStream();

获取读取流,然后像IO流一样操作就可以读取返回的数据了

  1. package tcp;
  2. import java.io.IOException;
  3. import java.io.InputStream;
  4. import java.io.OutputStream;
  5. import java.net.Socket;
  6. public class TCPClient2 {
  7. public static void main(String[] args) throws IOException{
  8. System.out.println("客户端2 run...");
  9. /**
  10. * 案例二:实现客户端和服务端的收发过程
  11. */
  12. //创建客户端socket对象,明确服务端地址和端口
  13. Socket s = new Socket("127.255.255.25",10009);
  14. //发送数据通过socket输出流完成
  15. OutputStream out = s.getOutputStream();
  16. out.write("服务端,我来了".getBytes());
  17. //读取服务器端返回的数据
  18. InputStream in = s.getInputStream();
  19. byte[] buf = new byte[1024];
  20. int len= in.read(buf);
  21. System.out.println(new String(buf,0,len));
  22. // int len = 0;
  23. // while((len = in.read(buf)) != -1)
  24. // {
  25. // System.out.println(new String(buf,0,len));
  26. // }
  27. //关闭资源
  28. s.close();
  29. }
  30. }

服务端要与客户端相连接,就必须创建一个服务端Serversocket对象,并明确端口,这个端口必须与客户端socket连接的端口一致,然后用一个socket对象去接收客户端的socket

  1. ServerSocket ss = new ServerSocket(10003);//创建服务端的socket。需要明确端口(监听一个端口),要不然客户端无法连接
  2. Socket s = ss.accept();//服务端只要获取到连接过来的客户端就可以和指定的客户端通信了

这个接收客户端的socket对象s里面封装了不光数据内容,还有数据来源的主机IP等等信息。
然后获取流对象,对客户端发送来的数据进行读取

  1. InputStream in = s.getInputStream();

接下来就和IO操作一样,对数据进行处理即可。

  1. import java.io.IOException;
  2. import java.io.InputStream;
  3. import java.net.ServerSocket;
  4. import java.net.Socket;
  5. public class TcpServer {
  6. public static void main(String[] args) throws IOException {
  7. System.out.println("服务端。。。");
  8. /**
  9. * 需求:获取客户端的数据并显示在屏幕上
  10. *
  11. * 思路:
  12. * 1、创建服务端的socket。需要明确端口(监听一个端口),要不然客户端无法连接
  13. * 2、服务端只要获取到连接过来的客户端就可以和指定的客户端通信了
  14. * 3、通过获取客户端的读取流对象读取客户端发来的数据
  15. * 33、并显示在屏幕上
  16. * 5、关闭资源
  17. */
  18. //1、创建服务端的socket。需要明确端口(监听一个端口),要不然客户端无法连接
  19. ServerSocket ss = new ServerSocket(10003);
  20. //2、服务端只要获取到连接过来的客户端就可以和指定的客户端通信了
  21. Socket s = ss.accept();
  22. String ip = s.getInetAddress().getHostAddress();
  23. System.out.println(ip+"...connected");
  24. //3、通过获取客户端的读取流对象读取客户端发来的数据
  25. InputStream in = s.getInputStream();
  26. //33、并显示在屏幕上
  27. byte[] buf = new byte[1024];
  28. int len = 0;
  29. while((len = in.read(buf)) != -1)
  30. {
  31. System.out.println(new String(buf, 0, len));
  32. }
  33. //5、关闭资源
  34. s.close();
  35. //ss.close(); 这一般不关
  36. }
  37. }

一般服务端接收到数据之后,它还会给客户端返回一些反馈信息,我们可以继续获取读写流,对客户端进行写入操作,即反馈信息。

  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. public class TcpServer2 {
  7. public static void main(String[] args) throws IOException {
  8. System.out.println("服务端2 run...");
  9. /**
  10. * 案例二:实现客户端和服务端的收发过程
  11. * 服务器端
  12. */
  13. //创建tcp服务端socket明确端口
  14. ServerSocket ss = new ServerSocket(10009);
  15. while(true)
  16. {
  17. //获取客户端对象
  18. Socket s = ss.accept();
  19. System.out.println(s.getInetAddress().getHostAddress()+"...connected");
  20. //读取客户端发送过来的数据
  21. InputStream in = s.getInputStream();
  22. byte[] buf = new byte[1024];
  23. int len = in.read(buf); //读取到数据之前,线程处于阻塞状态
  24. System.out.println(new String(buf,0,len));
  25. // int len = 0;
  26. // while((len = in.read(buf)) != -1)
  27. // {
  28. // System.out.println(new String(buf,0,len));
  29. // }
  30. //
  31. // System.out.println("阻塞了吗?");
  32. //给客户端回馈数据
  33. OutputStream out = s.getOutputStream();
  34. out.write("客户端。我已收到。哦耶!".getBytes());
  35. //关闭客户端
  36. s.close();
  37. }
  38. //关闭服务端
  39. //ss.close(); 如果是不断的获取客户端,就不用关闭服务器
  40. }
  41. }

先开启服务端
在这里插入图片描述
服务端收到数据
在这里插入图片描述
客户端收到反馈
在这里插入图片描述

版权声明:本文为vfdxvffd原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/vfdxvffd/p/11703323.html