TCP/IP socket编程

来源:互联网 发布:qq视频变脸软件 编辑:程序博客网 时间:2024/04/27 05:04
TCP/IP socket编程

先来介绍下网络协议:  
    TCP/IP  
        Transmission Control Protocol 传输控制协议  
        Internet Protocol 互联网协议  
    UDP  
        User Datagram Protocol 用户数据协议  

连接协议:  
    分为:  
    面向连接协议: Connection Oriented Protocol  
    非连接协议: Connectionless Protocol  

    1).面向连接协议是指两台电脑在传输数据前,先会建立一个专属的连接。就如电信局的交换机会为打电话双方提供专属连接一样。  
    Internet上的面向连接协议就是 TCP/IP  
    特点:确认回应;分组序号;流量控制。  
    TCP/IP属于可靠性传输,适合不容许有传输错误的网络程序设计使用  

    2).非连接协议:无专属连接,无分组,容错,距离短,可同时对多台电脑进行数据传输  
    Internet上的非连接协议就是 UDP  

    TCP在网络通信上有极强的生命力,例如远程连接( Telnet )和文件传输( FTP )都需要不定长度的数据被可靠地传输。相比之下 UDP 操作简单,而且仅需要较少的监护,因此通常用于局域网高可靠性的分散系统中client/server 应用程序。  


Socket 是程序与网络间的一种接口,大部分网络应用程序都是点对点的,所谓点就是服务器端和客户端所执行的程序。 Socket 是用来接收和传送分组的一个端点。  

java Socket 编程要用到 java.net 包,最常用的是 net 包下的 6 个类: InetAddress( 互联网协议  (IP)  地址 ) 类,Socket( 套接字 ) 类, ServerSocket( 套接字服务器 ) 类, DatagramSocket( 发送和接收数据报包的套接字 )  类,DatagramPacket( 数据报包 ) 类, MulticastSocket( 多播数据报套接字类用于发送和接收  IP  多播包 ) 类,其中InetAddress  Socket  ServerSocket 类是属于 TCP 面向连接协议, DatagramSocket 、  DatagramPacket MulticastSocket 类则属于 UDP 非连接协议的传送类。 

——From: http://cuishen.iteye.com/blog/242842

 

TCP 通信模型

Socket模型

 

示例代码:

UdpServer.java

[java] view plaincopy
  1. package me.bym.udp;  
  2. import java.io.IOException;  
  3. import java.net.DatagramPacket;  
  4. import java.net.DatagramSocket;  
  5. import java.net.SocketException;  
  6. public class UdpServer {  
  7.     public static void main(String[] args) {  
  8.         // 声明UPD socket,即DatagramSocket  
  9.         DatagramSocket socket = null;  
  10.         try {  
  11.             // 产生DatagramSocket对象,制定监听端口  
  12.             socket = new DatagramSocket(1234);  
  13.             // 设置消息读取缓冲区  
  14.             byte data[] = new byte[512];  
  15.             // 声明和定义UDP数据包,内容是消息缓冲区的内容  
  16.             DatagramPacket packet = new DatagramPacket(data, data.length);  
  17.             // 调用阻塞方法receiver接受客户端发来的内容存放到消息缓冲区packet中  
  18.             socket.receive(packet);  
  19.             // 打印消息  
  20.             String msg = new String(packet.getData(), packet.getOffset(),  
  21.                     packet.getLength());  
  22.             System.out.println(msg);  
  23.         } catch (SocketException e) {  
  24.             // TODO Auto-generated catch block  
  25.             e.printStackTrace();  
  26.         } catch (IOException e) {  
  27.             // TODO Auto-generated catch block  
  28.             e.printStackTrace();  
  29.         } finally {  
  30.             // 关闭socket  
  31.             socket.close();  
  32.         }  
  33.     }  
  34. }  

UdpClient.java

[java] view plaincopy
  1. package me.bym.udp;  
  2. import java.io.BufferedReader;  
  3. import java.io.IOException;  
  4. import java.io.InputStreamReader;  
  5. import java.net.DatagramPacket;  
  6. import java.net.DatagramSocket;  
  7. import java.net.InetAddress;  
  8. import java.net.SocketException;  
  9. public class UdpClient {  
  10.     public static void main(String[] args) {  
  11.         DatagramSocket socket = null;  
  12.         String msg = null;  
  13.         try {  
  14.             socket = new DatagramSocket();  
  15.             // 从标准输入(键盘)读取数据  
  16.             BufferedReader reader = new BufferedReader(new InputStreamReader(  
  17.                     System.in));  
  18.             while (!(msg = reader.readLine()).equalsIgnoreCase("exit")) {  
  19.                 // 产生一个InetAddress,内容是服务器端的IP  
  20.                 InetAddress serverAddress = InetAddress.getByName("127.0.0.1");  
  21.                 // 构造要发送消息的数据报, 并制定服务器监听的端口  
  22.                 DatagramPacket packet = new DatagramPacket(msg.getBytes(),  
  23.                         msg.getBytes().length, serverAddress, 1234);  
  24.                 // 发送数据报  
  25.                 socket.send(packet);  
  26.             }  
  27.         } catch (SocketException e) {  
  28.             // TODO Auto-generated catch block  
  29.             e.printStackTrace();  
  30.         } catch (IOException e) {  
  31.             // TODO Auto-generated catch block  
  32.             e.printStackTrace();  
  33.         } finally {  
  34.             socket.close();  
  35.         }  
  36.     }  
  37. }  

 

TcpServer.java

[java] view plaincopy
  1. package me.bym.tcp;  
  2. import java.io.IOException;  
  3. import java.io.InputStream;  
  4. import java.net.ServerSocket;  
  5. import java.net.Socket;  
  6. public class TcpServer {  
  7.     public static void main(String[] args) {  
  8.         // 声明一个服务器端socket  
  9.         ServerSocket serverSocket = null;  
  10.         // 声明一个socket来接受客户端连接  
  11.         Socket socket = null;  
  12.         try {  
  13.             int temp;  
  14.             // 定义服务器端socket并指定监听端口  
  15.             serverSocket = new ServerSocket(5937);  
  16.             // 调用阻塞式方法来获取客户端连接的socket  
  17.             socket = serverSocket.accept();  
  18.             // 获取客户端socket的输入流  
  19.             InputStream inputStream = socket.getInputStream();  
  20.             // 读取客户端socket的输入流的内容并输出  
  21.             byte[] buffer = new byte[512];  
  22.             while ((temp = inputStream.read(buffer)) != -1) {  
  23.                 System.out.println(new String(buffer, 0, temp));  
  24.             }  
  25.         } catch (IOException e) {  
  26.             // TODO Auto-generated catch block  
  27.             e.printStackTrace();  
  28.         } finally {  
  29.             try {  
  30.                 socket.close();  
  31.                 serverSocket.close();  
  32.             } catch (IOException e) {  
  33.                 // TODO Auto-generated catch block  
  34.                 e.printStackTrace();  
  35.             }  
  36.         }  
  37.     }  
  38. }  

TcpClient.java

[java] view plaincopy
  1. package me.bym.tcp;  
  2. import java.io.BufferedReader;  
  3. import java.io.IOException;  
  4. import java.io.InputStreamReader;  
  5. import java.io.OutputStream;  
  6. import java.net.Socket;  
  7. import java.net.UnknownHostException;  
  8. public class TcpClient {  
  9.     public static void main(String[] args) {  
  10.         // 声明一个socket  
  11.         Socket socket = null;  
  12.         try {  
  13.             String msg = null;  
  14.             // 产生socket对象,制定服务器地址和服务器监听的端口号  
  15.             socket = new Socket("127.0.0.1"5937);  
  16.             // 从标准输入(键盘)读取内容,获取socket的输出流,将读取到的内容放入输出流中  
  17.             BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));  
  18.             OutputStream outputStream = socket.getOutputStream();  
  19.             while (!(msg = reader.readLine()).equalsIgnoreCase("exit")) {  
  20.                 outputStream.write(msg.getBytes());  
  21.             }  
  22.         } catch (UnknownHostException e) {  
  23.             // TODO Auto-generated catch block  
  24.             e.printStackTrace();  
  25.         } catch (IOException e) {  
  26.             // TODO Auto-generated catch block  
  27.             e.printStackTrace();  
  28.         } finally {  
  29.             try {  
  30.                 socket.close();  
  31.             } catch (IOException e) {  
  32.                 // TODO Auto-generated catch block  
  33.                 e.printStackTrace();  
  34.             }  
  35.         }  
  36.     }  
  37.       
  38. }  

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 乙肝五项25阳性怎么办 流浓鼻涕怎么办速效办法 鼻涕又浓又黄绿怎么办 玉露已经徒长了怎么办 多肉长出了多头怎么办 多肉已经徒长了怎么办 脖子抻筋了 很疼怎么办 声带肥大造成说话声音沙哑怎么办 轻微的骨性龅牙怎么办 19岁没了晨勃怎么办 早上晨勃消失了怎么办 阴茎勃而不坚怎么办 一个月婴儿痰多怎么办 孕妇咳绿色浓痰怎么办 买的戒指大了怎么办 孩子鞋子买大了怎么办 鞋子不大但掉跟怎么办 鞋子长了一码怎么办 新鞋有点顶脚怎么办 宝宝鞋子买小了怎么办 鞋子买的小了怎么办 粉底液颜色偏黄怎么办 腿长的不直怎么办 多梦睡眠质量差怎么办 颈椎病引起的脑供血不足怎么办 骨头轻微的骨裂怎么办 怀孕六个月不想要怎么办 脚面一用力筋疼怎么办 肚子经常饿的响怎么办 一宿没睡第二天怎么办 婚姻走不下去了 怎么办 作业好多怎么办想哭了 熬夜后恶心想吐怎么办 脸上长了小肉瘤怎么办 6sp电池不耐用怎么办 小孩个子长得慢怎么办 4岁儿童身高偏矮怎么办 13孩子身高偏矮怎么办 9岁儿童身高偏矮怎么办 3岁宝宝个子偏矮怎么办 6岁宝宝个子偏矮怎么办