简单的tcp聊天
package com.pers.tcptest; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.InetAddress; import java.net.ServerSocket; import java.net.Socket; import java.util.Scanner; import org.junit.Test; public class TCPTest { @Test// 客户端 public void client() { Socket socket = null; Scanner scanner = null; OutputStream os = null; InputStream is = null; try { socket = new Socket(InetAddress.getByName("127.0.0.1"), 9092); // 输出流 程序到数据 write os = socket.getOutputStream(); System.out.println("请输入多个字符:"); // 封装键盘输入流 scanner = new Scanner(System.in); String str = scanner.next(); os.write(str.getBytes());//发送出去 //必须加上 表示我这边发送结束 服务端可以read去循环读取了 交互性 socket.shutdownOutput(); // 输入流 把数据读到程序中 显示出来 is = socket.getInputStream(); byte[] b = new byte[10]; int len; while ((len = is.read(b)) != -1) { String str2 = new String(b, 0, len); System.out.println(str2);// str2是读取到的所有信息内容 } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { // 一定记得把稀缺的流资源关闭,一旦上面报错 关闭流 判断是否为null 避免还没创建流呢 就执行关闭 造成空指针异常 if (is != null) { try { is.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } try { if (os != null) { os.close(); } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } if (scanner != null) scanner.close(); try { if (socket != null) { socket.close(); } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } @Test// 服务端 public void server() { ServerSocket ss = null; Socket socket = null; // 接受来自客户端的信息 InputStream is = null; // 返回给客户端信息 OutputStream os = null; try { ss = new ServerSocket(9092); socket = ss.accept(); // 接受来自客户端的信息 is = socket.getInputStream(); byte[] b = new byte[10];//输入 就要 考虑接收一下读过来的字节数据 int len; String str = new String(); while ((len = is.read(b)) != -1) {//考虑多余10个字节的数据 一次读取不完 分批次放到str中 String str2 = new String(b, 0, len); str += str2; System.out.println("服务端接收过来的信息是:"+str); } // 返回给客户端大写的串信息 os = socket.getOutputStream(); os.write(str.toUpperCase().getBytes()); } catch (IOException e) { e.printStackTrace(); } finally { try { if (os != null) { os.close(); } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } try { is.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } try { socket.close(); } catch (IOException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } try { ss.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } ----------------------------------运行结果 先执行服务端 再执行客户端 客户端 请输入多个字符: hdhaihdoihio (点击回车,服务端接收转为大写之后再发送给客户端) HDHAIHDOIH (因为一次读取10个字节 所以分两次读完的) IO 服务端 服务端接收过来的信息是:hdhaihdoih 服务端接收过来的信息是:io
课余之外 可以去了解两个东东 如下:
你们都是有经验的开发人员