一. TCP 通信所用到的类
一.一 ServerSocket 服务器类
是服务器端所要用到的类。
一.一.一 构造方法
一.一.一.一 方法
一.一.一.二 演示构造方法
@Test public void conTest() throws Exception{ //放置端口号, 监听9999端口 ServerSocket serverSocket=new ServerSocket(9999); }
一.一.二 其他方法
一.二 Socket 客户端类
一.二.一 构造方法
一.二.一.一 方法
一.二.一.二 演示构造方法
@Test public void conTest() throws Exception{ //第一种, 传入主机名和端口号。 注意,这个端口号是服务器的那个监听端口 Socket socket=new Socket("localhost",9999); //第二种,传入地址对象 InetAddress inetAddress=InetAddress.getByName("localhost"); Socket socket1=new Socket(inetAddress,9999); }
一.二.二 其他方法
一.三 演示服务器和客户端
一.三.一 服务器端
@Test public void serverTest() throws Exception{ System.out.println("服务器启动中"); ServerSocket serverSocket=new ServerSocket(9999); //阻塞式接收 Socket client=serverSocket.accept(); System.out.println("端口:"+serverSocket.getLocalPort()); System.out.println("连接一个客户端程序"); }
一.三.二 客户端
@Test public void clientTest() throws Exception{ System.out.println("启动客户端"); Socket socket=new Socket("localhost",9999); }
一.三.三 测试运行
先运行服务器端, 查看控制台输出,
线程一直在阻塞。
再运行客户端
这个时候,再去查询一下服务器端的控制台
会往下运行,接收到客户端的对象信息。
二. 演示各种 TCP 通信
TCP 通信的情况,与 UDP 通信的情况,基本是一样的。
二.一 演示单条字符串
二.一.一 客户端
@Test public void client2Test() throws Exception{ System.out.println("启动客户端,发送单条数据"); Socket socket=new Socket("localhost",9999); //发送数据 //客户端的输入 OutputStream outputStream= socket.getOutputStream(); //写入单条数据 outputStream.write("两个蝴蝶飞,你好啊".getBytes()); outputStream.close(); socket.close(); }
二.一.二 服务器端
@Test public void server2Test() throws Exception{ System.out.println("服务器启动中"); ServerSocket serverSocket=new ServerSocket(9999); //阻塞式接收 Socket client=serverSocket.accept(); System.out.println("连接一个客户端程序"); //得到输入流 InputStream inputStream=client.getInputStream(); byte[] bytes=new byte[1024]; //读取内容,放置到 bytes字节数组里面 int len=inputStream.read(bytes); System.out.println("获取客户端传递过来的内容:"+new String(bytes,0,len)); }
二.一.三 运行程序
先启动服务器,再启动客户端
二.二 发送多条不同类型的数据
二.二.一 客户端
@Test public void client3Test() throws Exception{ System.out.println("启动客户端,发送多条不同类型的数据"); Socket socket=new Socket("localhost",9999); //发送数据 //客户端的输入 OutputStream outputStream= socket.getOutputStream(); DataOutputStream dataOutputStream=new DataOutputStream(outputStream); //发送字符串 dataOutputStream.writeUTF("两个蝴蝶飞"); //发送int 类型 dataOutputStream.writeInt(24); //发送字符串 dataOutputStream.writeUTF("一个快乐的程序员"); dataOutputStream.flush(); socket.close(); }
二.二.二 服务器端
@Test public void server3Test() throws Exception{ System.out.println("服务器启动中"); ServerSocket serverSocket=new ServerSocket(9999); //阻塞式接收 Socket client=serverSocket.accept(); System.out.println("连接一个客户端程序,接收多条数据"); InputStream inputStream=client.getInputStream(); DataInputStream dataInputStream=new DataInputStream(inputStream); //接收字符串 String name=dataInputStream.readUTF(); //接收 int 类型 int age= dataInputStream.readInt(); //接收 字符串 String desc=dataInputStream.readUTF(); System.out.printf("姓名是:%s,年龄是:%d,描述是:%s",name,age,desc); }
二.二.三 运行程序
二.三 发送对象数据
二.三.一 客户端
@Test public void client3ObjectTest() throws Exception{ System.out.println("启动客户端,发送多条对象数据"); Socket socket=new Socket("localhost",9999); //发送数据 //客户端的输入 OutputStream outputStream= socket.getOutputStream(); ObjectOutputStream objectOutputStream=new ObjectOutputStream(new BufferedOutputStream(outputStream)); //放入对象 Person person=new Person(); person.setId(1); person.setName("两个蝴蝶飞"); person.setSex('男'); person.setAge(24); person.setDesc("一个快乐的程序员"); objectOutputStream.writeObject(person); //放置日期 objectOutputStream.writeObject(new Date()); //一定不要忘记刷新 objectOutputStream.flush(); socket.close(); }
二.三.二 服务器端
@Test public void server3ObjectTest() throws Exception{ System.out.println("服务器启动中"); ServerSocket serverSocket=new ServerSocket(9999); //阻塞式接收 Socket client=serverSocket.accept(); System.out.println("连接一个客户端程序,接收对象数据"); InputStream inputStream=client.getInputStream(); ObjectInputStream objectInputStream=new ObjectInputStream(new BufferedInputStream(inputStream)); //读取数据 Object obj1=objectInputStream.readObject(); if(obj1 instanceof Person){ Person person=(Person)obj1; System.out.println(person.toString()); }else{ System.out.println("接收格式有误"); } Object obj2=objectInputStream.readObject(); if(obj2 instanceof Date){ SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd"); System.out.println("日期:"+sdf.format((Date)obj2)); }else{ System.out.println("接收格式有误"); } }
二.三.三 测试运行
先启动服务器,再启动客户端