Java网络编程-实现TCP的网络编程
案例一:服务器收到客户端发送的信息,并打印到控制台
客户端
@Test public void client02(){ Socket socket=null; //造一个数据输出流 DataOutputStream dos=null; try { //造一个Socket套接字 socket=new Socket("127.0.0.1",4433); //数据输出流的输出位置是 socket的输出流 dos=new DataOutputStream(socket.getOutputStream()); //给服务器传送数据 for(int i=0;i<1024;i++) { //使用数据输出流输出基本数据类型数据 dos.writeUTF("我是客户端,你好服务器\n"); } } catch (IOException e) { e.printStackTrace(); }finally { //关闭资源 if (dos != null) { try { dos.close(); } catch (IOException e) { e.printStackTrace(); } } if (socket != null) { try { socket.close(); } catch (IOException e) { e.printStackTrace(); } } } }
服务器
@Test public void server02() { try { ServerSocket serverSocket=new ServerSocket(4433); while (true) { Socket client = serverSocket.accept(); InputStream is = client.getInputStream(); int len; byte [] bytes=new byte[5]; //不建议这样写,可能会乱码 while ((len=is.read(bytes))!=-1) { String str=new String(bytes,0,len); System.out.println(str); } } } catch (IOException e) { e.printStackTrace(); } }
服务器不建议这样直接读取数据,可能会乱码
我
是�
�户�
��,�
�好�
��务
器
推荐写法
@Test public void server02() { try { ServerSocket serverSocket=new ServerSocket(4433); while (true) { Socket client = serverSocket.accept(); InputStream is = client.getInputStream(); int len; byte [] bytes=new byte[5]; ByteArrayOutputStream bos=new ByteArrayOutputStream(); while ((len=is.read(bytes))!=-1) { bos.write(bytes,0,len); } String str=bos.toString(); System.out.println(str); } } catch (IOException e) { e.printStackTrace(); } }
我是客户端,你好服务器 我是客户端,你好服务器 我是客户端,你好服务器 ...
补充:
Java ByteArrayOutputStream类
字节数组输出流在内存中创建一个字节数组缓冲区,所有发送到输出流的数据保存在该字节数组缓冲区中。
另外也可以使用转换流处理,效率较低
@Test public void server02() { try { ServerSocket serverSocket=new ServerSocket(4433); while (true) { Socket client = serverSocket.accept(); InputStream is = client.getInputStream(); int len; //方式二,使用转换流 InputStreamReader isr=new InputStreamReader(is); char [] cbuf=new char[5]; while ((len=isr.read(cbuf))!=-1) { for (int i=0;i<len;i++) { System.out.print(cbuf[i]); } } } } catch (IOException e) { e.printStackTrace(); } }
案例二:服务器收到客户端数据,并将数据回传给客户端
客户端
@Test public void client03() { Socket socket=null; ByteArrayOutputStream bos=new ByteArrayOutputStream(); try { socket=new Socket("127.0.0.1",4443); //发送数据给服务器 String str=new String("你好服务器,我是李华"); byte[] strBytes = str.getBytes(StandardCharsets.UTF_8); socket.getOutputStream().write(strBytes); //告诉服务器我已经发送完所有数据了 socket.shutdownOutput(); //接受服务器回传数据 int len; byte [] bytes=new byte[1024]; while ((len=socket.getInputStream().read(bytes))!=-1) { bos.write(bytes,0,len); } System.out.println(bos.toString()); } catch (IOException e) { e.printStackTrace(); }finally { //资源关闭 try { bos.close(); } catch (IOException e) { e.printStackTrace(); } if (socket != null) { try { socket.close(); } catch (IOException e) { e.printStackTrace(); } } } }
服务器
@Test public void server03() { try { ServerSocket serverSocket=new ServerSocket(4443); while (true) { ByteArrayOutputStream bos=new ByteArrayOutputStream(); Socket client = serverSocket.accept(); int len; byte [] bytes=new byte[1024]; while ((len=client.getInputStream().read(bytes))!=-1) { bos.write(bytes,0,len); } String str=bos.toString(); System.out.println(str); String str1="我是服务器,我已经收到你的信息{"+str+"}"; byte[] str1Bytes = str1.getBytes(StandardCharsets.UTF_8); client.getOutputStream().write(str1Bytes); client.shutdownOutput(); client.close(); } } catch (IOException e) { e.printStackTrace(); } }
客户端
我是服务器,我已经收到你的信息{你好服务器,我是李华}
服务器
你好服务器,我是李华
案例三:客户端给服务器发送文件,服务器保存文件到本地,并把文件路径告诉客户端
客户端
@Test public void client04() { try { Socket socket=new Socket("127.0.0.1",4443); //读取文件并发送 File file=new File("hello.txt"); FileInputStream fis=new FileInputStream(file); int len; byte [] buff=new byte[1024]; while ((len=fis.read(buff))!=-1) { socket.getOutputStream().write(buff,0,len); } socket.shutdownOutput(); //读取服务器发来的信息 buff=new byte[1024]; ByteArrayOutputStream baos=new ByteArrayOutputStream(); while ((len=socket.getInputStream().read(buff))!=-1) { baos.write(buff,0,len); } System.out.println(baos.toString()); //关闭资源 baos.close(); fis.close(); socket.close(); } catch (IOException e) { e.printStackTrace(); } }
服务器
@Test public void server04() { try { ServerSocket serverSocket=new ServerSocket(4443); while (true) { Socket client = serverSocket.accept(); String str=System.currentTimeMillis()+".txt"; File file=new File(str); FileOutputStream fos=new FileOutputStream(file); int len; byte [] buff=new byte[1024]; while ((len=client.getInputStream().read(buff))!=-1) { fos.write(buff,0,len); } byte[] strBytes = str.getBytes(StandardCharsets.UTF_8); client.getOutputStream().write(strBytes); client.shutdownOutput(); client.close(); } } catch (IOException e) { e.printStackTrace(); } }
客户端
1604033753035.txt
服务器