zoukankan      html  css  js  c++  java
  • Socket网络编程TCP、UDP演示样例

    Socket网络编程:

    1) OSI(了解):

    国际标准化组织ISO(International Orgnization for Standardization)指定了网络通信的模型:开放系统互联(OSI,Open System Interconnection),把网络通信工作分为七层:物理层(最底层)-数据链路层-网络层-传输层-会话层-表示层-应用层(应用程序)

     

    数据格式

    功能与连接方式

    典型设备

    应用层 

    网络服务与使用者应用程序间的一个接口

    表示层 

    数据表示、数据安全、数据压缩

    会话层 

    建立、管理和终止会话

    传输层 

    数据组织成数据段Segment

    用一个寻址机制来标识一个特定的应用程序(port号)

    网络层 

    切割和又一次组合数据包Packet

    基于网络层地址(IP地址)进行不同网络系统间的路径选择

    路由器

    数据链路层

    将比特信息封装成数据帧Frame

    在物理层上建立、撤销、标识逻辑链接和链路复用 以及差错校验等功能。通过使用接收系统的硬件地址或物理地址来寻址

    网桥、交换机、网卡

    物理层

    传输比特(bit)流

    建立、维护和取消物理连接

    光纤、同轴电缆、

    双绞线、中继器和集线器

    2) TCP/IP模型:网络通信协议。将OSI简化为四层:

    a. 应用层:

    b. 传输层:TCP协议、UDP协议是传输层协议

    c. 网络层:IP协议、ICMP协议是传输层协议

    d. 网络接口层:

    ① TCP协议(传输控制协议):

    传输层协议。面向连接(须要建立两方会话),可靠的(发送若没收回确认信息,则又一次发送)。速度慢。

    建立TCP连接须要三次握手,终止它须要四次握手。比如:web应用。下载文件断点续传。

    ② UDP协议(用户数据报协议):

    传输层协议。面向无连接(仅仅是一方发送)。不可靠(仅仅发送不确认,可能会丢包)。速度快,将数据压缩成数据包,数据报限制大小在64K以内。

    如:CS,QQ,在线视频,语音电话。

    ③ IP协议:

    网络层协议。面向无连接。

    IP地址(IPv4)由4个字节组成。具有唯一性。依据网络号和主机号所占字节数分为ABCDE五类地址。

    (參考《TCP/IP具体解释》)

    ④ ICMP协议:

    网络层协议。面向无连接,用于传输出错报告控制信息.比方用于检查网络通不通的Ping命令,“Ping”的过程实际上就是ICMP协议工作的过程。

    3) Socket网络编程:

    ① 原理:通过建立一个双向的网络通信连接实现数据交换,通信的两端都称作一个Socket。

    ② 广泛使用:能够在Linux。Unix,Windows平台使用而且C语言,JAVA都支持Socket。

    ③ 网络通讯要素:

    IP地址、port号、传输协议

    ④ JAVA Socket通信须要java.net包下的Socket和ServerSocket实现client和server端。

    建立连接所需的寻址信息是远程计算机的IP地址和port号。

    port号:[了解]port号占两个字节。一台机器能够存在65536个port号,port有什么用呢?我们知道。一台拥有IP地址的主机能够提供很多服务,比方Web服务、FTP服务、SMTP服务等,这些服务全然能够通过1个IP地址来实现。那么,主机是如何区分不同的网络服务呢?显然不能仅仅靠IP地址,由于IP 地址与网络服务的关系是一对多的关系。实际上是通过“IP地址+port号”来区 分不同的服务的。

     0-1024为系统保留port,ftpport是21,smtpport号25,pop3port号110,port号分为TCPport和UDPport,每一个都有65536个。

    ⑤ DNS:Domain Name System,域名系统 ,依据主机名找到对于的ip地址。先到C:WindowsSystem32driversetchosts文件里解析。

    ⑥ JAVA中使用网络编程:

    a. UDP方式:

    建立DatagramSocket对象。作为发送端和接收端。利用send和receive方法对数据包进行传输。建立DatagramPacket数据包作为发送和存储信息的载体。

    通过getData、getPort、getAddress.getHostAddress等方法获取对方数据、对方port和对方主机ip地址。

    b. TCP方式:

    建立client:建立Socket对象,构造时指定连接的主机的ip地址/主机名、port。利用getInputStream、getOutputStream方法得到字节输入输出流。



    TCP:

     一句话:server端绑定(创建Socket时绑定)并监听(accept方法)一个port,client连接到这个port,两者通过各自建立一个socket,利用getOutputStream和getInputStream方法进行write和read,完毕通信,client使用的port是系统随机指定的,不必关心。

    使用TCP进行网络编程。client向server端发送一个字符串。

    server收到该字符串后将其打印到命令行上,然后向client返回该字符串的长度,最后。

    client输出server端返回的该字符串的长度。


    TCP_client.java

    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.io.OutputStream;
    import java.net.Socket;
    
    public class TCP_client {
    	public static void main(String[] args) throws IOException {
    		//创建一个流套接字并将其连接到指定 IP 地址/主机名的指定端口号。
    		Socket socket = new Socket("lj", 8888);
    		//Socket socket = new Socket("127.0.0.1", 8888);
    		System.out.println("client started");
    		//server端发送数据到客户端,从键盘获取该字符串
    		System.out.println("请输入字符串:");
    		BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
    		String line = bufferedReader.readLine();
    		OutputStream outputStream = socket.getOutputStream();
    		outputStream.write(line.getBytes());
    		//客户端接收server端数据
    		InputStream inputStream = socket.getInputStream();
    		byte[] buf = new byte[1024];
    		int len = inputStream.read(buf);
    		String text = new String(buf,0,len);
    		System.out.println("长度为:"+text);
    		socket.close();
    	}
    }


    TCP_server.java

    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.net.ServerSocket;
    import java.net.Socket;
    
    public class TCP_server {
    	public static void main(String[] args) throws IOException {
    		//创建绑定到特定端口服务器Socket
    		ServerSocket serverSocket = new ServerSocket(8888);
    		System.out.println("server started...");
    		//监听该Socket端口
    		 Socket socket = serverSocket.accept();
    		 //服务器端接收client数据
    		 InputStream inputStream = socket.getInputStream();
    		 byte[] buf = new byte[1024];
    		 int len = inputStream.read(buf);
    		 String text = new String(buf,0,len);
    		 System.out.println(text);
    		 //服务器端发送返回数据到client
    		 OutputStream outputStream = socket.getOutputStream();
    		 outputStream.write(String.valueOf(text.length()).getBytes());
    		 serverSocket.close();
    	}
    }
    


    UDP:

    一句话。接收端绑定并监听一个port,建立数据包并通过Socket的receive(dp)方法接收,发送端建立数据包并指定接收端ip地址与port。通过Socket的send(dp)方法发送。

    发送端使用的port是系统随机指定的,不必关心。

    使用UDP进行网络编程。发送端向接收端发送一个字符串。接收端收到该字符串后将其打印到命令行上。


    UDP_client.java

    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.net.DatagramPacket;
    import java.net.DatagramSocket;
    import java.net.InetAddress;
    
    public class UDP_client {
    	public static void main(String[] args) throws IOException {
    		DatagramSocket socket = new DatagramSocket(10000);
    		System.out.println("client started...");
    		BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
    		byte[] buf =reader.readLine().getBytes();
    		//第三个參数是发送的指定的Socket端口
    		DatagramPacket packet = new DatagramPacket(buf , buf.length,InetAddress.getByName("127.0.0.1"),1111);
    		socket.send(packet);//堵塞式
    		socket.close();
    	}
    }


    UDP_server.java

    import java.io.IOException;
    import java.net.DatagramPacket;
    import java.net.DatagramSocket;
    
    public class UDP_server {
    	public static void main(String[] args) throws IOException {
    		DatagramSocket socket = new DatagramSocket(1111);
    		System.out.println("server started...");
    		byte[] buf = new byte[1024];
    		DatagramPacket packet = new DatagramPacket(buf,buf.length);//client数据包须要指定端口号,服务器端不用指定。

    socket.receive(packet); //packet.getPort()返回某台远程主机的端口号,此数据报将要发往该主机或者是从该主机接收到的。

    System.out.println("http://"+packet.getAddress().getHostAddress()+":"+(packet.getPort())); System.out.println(new String(packet.getData())); socket.close(); } }




  • 相关阅读:
    Excel 相关实用计算公式
    C# ThreadState属性分析
    U8 数据库服务器和应用服务器 分离后出现 登陆系统管理 远程组件初始化 失败 解决方案!
    MyEclipse 快捷键
    项目中用到的开源框架
    spring.net nhibernate 不一定是自增变量,也可能是触发器 Batch update returned unexpected row count from update; actual row count: 2; expected: 1
    解决方法: A C3P0Registry mbean is already registered.This probably means that an application using c3p0的警告信息处理
    NHibenate hbm.xml 自动 生成 数据库表的时候 长度为1
    解决方法: Failed to load the sqljdbc_auth.dll
    SQL 中判断 纯数字
  • 原文地址:https://www.cnblogs.com/lxjshuju/p/6829989.html
Copyright © 2011-2022 走看看