一、TCP/UDP对比

二、TCP编程

  1. TCP字节流编程
    - Server端:
public class TCPServerStream {public static void main(String[] args) {/** 1.在本机的 9999 端口监听,等待连接* 2.当没有客户端链接9999端口时,程序会阻塞,等待链接* 3.通过socket.getInputStream()读取客户端写入到数据通道的数据,显示*///注意细节:则个ServerSocket可以通过accept()返回多个Socket[多个客户端链接服务器的并发]try (ServerSocket serverSocket = new ServerSocket(9999)) {System.out.println("server start at port:9999....");//有链接时返回socket对象Socket accept = serverSocket.accept();System.out.println("client has already connected");try (InputStream inputStream = accept.getInputStream();OutputStream outputStream = accept.getOutputStream()) {byte[] bytes=new byte[1024];int text;while ((text=inputStream.read(bytes))!=-1){System.out.println(new String(bytes,0,text));}//发送给client端信息outputStream.write("hello client".getBytes());System.out.println("server exit...");}} catch (IOException e) {e.printStackTrace();};}
}
  • client端
public class TCPClientStream {public static void main(String[] args) {/** 1.链接服务端(ip+port)* 2.连接上后,生成Socket,通过socket.getOutputStream()* 3.将数据写入到数据通道*///链接本机:9999 端口System.out.println("client connecting......");try (Socket socket = new Socket(InetAddress.getLocalHost(), 9999)) {System.out.println("client connected......");//得到与socket相关联的输出流对象,发送信息try (OutputStream outputStream = socket.getOutputStream();InputStream inputStream=socket.getInputStream()) {//发送完一个消息后,要有结束标记(socket.shutdownOutput();),不然会阻塞outputStream.write(("hello server".getBytes()));//非buffer字节流,无需flush//outputStream.flush();//单方向关闭client端的输出流(不会关闭socket),不然会阻塞socket.shutdownOutput();byte[] bytes=new byte[1024];int text;while ((text=inputStream.read(bytes))!=-1){System.out.println(new String(bytes,0,text));}System.out.println("client exit...");}} catch (IOException e) {e.printStackTrace();}}
}

注意:

  • 这里调用Socket的shutdownOutput()方法,底层会告知服务端我这边已经写完了,那么服务端收到消息后,就能知道已经读取完消息,如果服务端有要返回给客户的消息那么就可以通过服务端的输出流发送给客户端,如果没有,直接关闭Socket。
  • 这种方式通过关闭客户端的输出流,告知服务端已经写完了,虽然可以读到服务端发送的消息,但是还是有一点缺点:不能再次发送消息给服务端,如果再次发送,需要重新建立Socket连接这个缺点,在访问频率比较高的情况下将是一个需要优化的地方。

优化文章

  1. TCP字符流编程
  • server
public class TCPServerCharacterStream extends Thread{private ServerSocket serverSocket;public static void main(String[] args) {TCPServerCharacterStream tcpServerCharacterStream=new TCPServerCharacterStream();tcpServerCharacterStream.start();}public TCPServerCharacterStream(){try{serverSocket = new ServerSocket(8888);}catch (Exception e){e.printStackTrace();}}@Overridepublic void run() {while (true){try {System.out.println("server waiting for connecting....");//阻塞等待连接Socket accept = serverSocket.accept();System.out.println("client has already connected....");try (BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(accept.getInputStream(), "UTF-8"));BufferedWriter bufferedWriter=new BufferedWriter(new OutputStreamWriter(accept.getOutputStream(),"UTF-8"))) {System.out.println("using socket is: "+accept);System.out.println("get message : "+bufferedReader.readLine());//给客户端发送bufferedWriter.write("hello client from server");//结束标志bufferedWriter.newLine();System.out.println("server exit....");}} catch (IOException e) {e.printStackTrace();}}}
}
  • client
public class TCPClientCharacterStream extends Thread{public static void main(String[] args) {System.out.println("client connecting......");try (Socket socket = new Socket(InetAddress.getLocalHost(), 8888)) {System.out.println("client connected......");try (BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream(), "UTF-8"));BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream(),"UTF-8"))){System.out.println("start to send message....");//给服务端发送System.out.println("using socket is: "+socket);bufferedWriter.write("sending: hello server from client");System.out.println("ending send message...");//结束标记,要求接收方使用readLine()读取;bufferedWriter.newLine();//try resource模式下,如果只是进行写操作,不像我这样读写切换的话,好像是会因为自动close而自动flush。//比如我server端里面,因为写操作是在读操作后面的,所以try resource自动close后也能正常运行。//但像我client里面,因为写操作后,try resource段还没运行完,就必须手动flush,才能提交。bufferedWriter.flush();System.out.println(socket.isClosed());System.out.println("get message : "+bufferedReader.readLine());System.out.println("client exit...");}} catch (IOException e) {e.printStackTrace();}}
}

注意:

try resource模式下,如果只是进行写操作,不像我这样读写切换的话,好像是会因为自动close而自动flush。比如我server端里面,因为写操作是在读操作后面的,所以try resource自动close后也能正常运行。但像我client里面,因为写操作后,try resource段还没运行完,就必须手动flush,才能提交。

原生JAVA的TCP/UDP编程相关推荐

  1. Java TCP/UDP编程

    java TCP & UDP编程 UDP编程 TCP编程 UDP编程 UPD: User Datagram Protocol.面向无连接,不安全. UDP中,发送方无需知道接收方是否接受,只考 ...

  2. TCP/UDP编程中的问题汇总

    TCP/UDP编程中的问题汇总 TCP和UDP发送大文件的问题. 答: 发送端: 发送时,先发送文件的名称及大小等信息. 然后,设置一个缓冲区的大小,假设为4K. 再循环读4K的文件内容,并发送,直到 ...

  3. .Net TCP/UDP 编程 【一】【原创】

    命名空间: using System.Net; using System.Net.Sockets; 关键 : TCP /UDP连接 UDP UDP 与 tCP的主要区别在于 UDP 不一定提供可靠的数 ...

  4. Java的TCP/UDP网络编程+多线程实现服务器端与客户端间的通信

    写在前面: Java为网络编程提供了丰富的库,我们能通过调用Socket套接字的方法实现服务器与客户端的双通信. 注意点: 需要注意的是端口的对应,端口可以理解为窗户,服务器只能通过某个端口(窗户)与 ...

  5. socket与TCP/UDP编程-转

    Socket接口是TCP/IP网络的API,Socket接口定义了许多函数或例程,程序员可以用它们来开发TCP/IP网络上的应用程序.要学Internet上的TCP/IP网络编程,必须理解Socket ...

  6. [windows网络编程]tcp/udp编程初步详解-转

    #pragma comment (lib,"ws2_32.lib") #include <Winsock2.h> #include <stdio.h> 如你 ...

  7. TCP/UDP编程基础

    一.Socket 1.TCP/IP 要想理解socket首先得熟悉一下TCP/IP协议族, TCP/IP(Transmission Control Protocol/Internet Protocol ...

  8. Qt中的TCP/UDP编程

    网络编程,OSI(开放式系统互联参考模型)七层参考模型:应用层.表示层.会话层.传输层.网络层.数据链路层.物理层.     套接字(Socket)是网络通信的基本构建模块,又分为流式套接字(Stre ...

  9. 【Java】TCP Socket编程案例——文件传输聊天工具

    TCP(传输控制协议)是面向连接的可靠数据传输协议.TCP连接一旦建立起来,一直占用,直到关闭连接.另外,TCP为了保证数据的正确性,会重发一切没有收到的数据,还会对数据内容进行验证,并保证数据传输的 ...

最新文章

  1. Myeclipse优化设置,加速你的开发武器
  2. 小区的足球场地实地拍摄
  3. [JZOJ5281]钦点题解--瞎搞+链表
  4. 猫、交换机和路由器的区别
  5. Windows的三种坐标系:屏幕坐标系,非客户区坐标系,客户区坐标系
  6. postgres 退出_如何退出postgresql
  7. iOS 文件和数据管理 (可能会删除本地文件储存)
  8. Python 多线程进程高级指南(二)
  9. JAVA如何分段_OpenCV Java文本分段
  10. 什么是Web渗透测试
  11. 平均数和均值一样吗_求平均数!
  12. 固态硬盘量产工具_FORESEE G500发布,江波龙国产固态硬盘再发声
  13. Elasticsearch聚合学习之二:区间聚合
  14. Android Minui 相关API说明
  15. 为什么要放弃Evernote?Effie:为写作而生
  16. spring基础概述
  17. 一个35岁男人的自学编程之路
  18. HTML5 Canvas编写五彩连珠(5):寻路
  19. 十月十日JavaScript基础3
  20. python panda3d从入门_panda3d入门

热门文章

  1. Codeforces Round #582 (Div. 3)
  2. EasyNVR支持的摄像机、NVR设备接入类型以及关于国标设备是否支持接入EasyNVR无插件流媒体服务器...
  3. bzoj 3747: [POI2015]Kinoman
  4. 读书笔记《单核工作法》_6:颠倒you'xian'ji
  5. R学习笔记:运行时间记录
  6. Zero Copy 简介
  7. java.lang.ClassNotFoundException: org.springframework.web.context.ContextLoaderL,spring获取context
  8. ImportError: No module named sklearn.metrics
  9. [云炬创业学笔记]第二章决定成为创业者测试14
  10. 新挑战之打造一流能源新材计算平台 2018-10-10