• Java之Socket编程


    引言:

      TCP/IP是一种网络通信协议,它规范了网络上所有通信设备的数据传送格式以及传送方式,是Internet上的基础协议。在TCP/IP协议组中有两种主要协议:

    一)传输层协议

    a)传输层控制协议(TCP)

      它建立在面向连接的基础上。双方通信之前先建立连接,然后双方即可在其上发送数据流实现通信,使用完毕后再关闭连接。这种协议的优点是效率高,缺点是在建立连接关闭连接时需要额外的开销。

    b)用户数据报协议(UDP)

      UDP较TCP简单不少,是对IP协议组的扩充。与TCP不同,UDP是提供面向无连接、“不可靠”的数据报服务。

    二)应用层协议

      应用层中定义了许多高层协议。TELNET(远程终端访问)、FTP(文件传输协议)、SMTP(简单邮件传输协议)、DNS(域名服务)、HTTP(超文本传输协议)等。

    Socket编程 

      它允许程序员把网络连接当成一个流,并向这个流读写字节。Socket对程序员隐藏了网络的低层细节,如纠错、包大小、包和重传、网络地址等。

    A)基于TCP的Socket编程

      需要编写服务器端和客户端两个应用程序。主要用到两个类,Socket、ServerSocket。它们都位于java.net包中。

    1)服务器端编写步骤

      a)创建一个等待连接的ServerSocket对象。

      b)调用ServerSocket的accept方法侦听客户端的连接请求。当侦听到一个连接后,返回一个Socket对象,连接成功。

      c)创建与Socket对象绑定的输入、输出流,并建立相应的数据输入输出流。

      d)通过数据输入输出流与客户端进行数据读写,完成双向通信。

      e)当客户端断开连接后,关闭各个流,结束通信。

      f)不断执行(b~e)

    请看示例代码:

    import java.io.*;
    import java.net.*;
    
    import static java.lang.System.*;
    
    public class TestServer {
    
    	public static void main(String[] args) throws IOException {
    		ServerSocket ss = new ServerSocket(6666);
    		out.println("start......");
              while(true){ Socket s = ss.accept(); // 阻塞式 err.println("a client accepted");
              //建立输入流,接收客户端发来的数据 InputStream is = s.getInputStream(); DataInputStream dis = new DataInputStream(is); out.println(dis.readUTF());// 阻塞式           
              //建立输出流,向客户端发送数据 OutputStream os = s.getOutputStream(); DataOutputStream dos = new DataOutputStream(os); dos.writeUTF("Server:hello client!..."); in.close(); out.close(); ss.close();
            } } }

    2)客户端编写步骤

      a)创建指定服务器上指定端口号的Socket对象

      b)创建与Socket对象绑定的输入、输出流,并建立相应的数据输入输出流。

      c)通过数据输入输出流与客户端进行数据读写,完成双向通信。

      d)关闭与服务器的连接,关闭各个流,结束通信。

    示例代码:

    import java.io.*;
    import java.net.*;
    import static java.lang.System.*;
    
    public class TestClient {
    
    	public static void main(String[] args) throws UnknownHostException,
    			IOException {
    		Socket s = new Socket("127.0.0.1", 6666);
    		
    		OutputStream os = s.getOutputStream();
    		DataOutputStream dos = new DataOutputStream(os);
    		dos.writeUTF("client: hello server!...");
    
    		DataInputStream dis = new DataInputStream(s.getInputStream());
    		err.println(dis.readUTF());
    	}
    }
    

    B)基于UDP的Socket编程 

      开发基于UDP协议的网络应用程序时,也要分别编写服务器端与客户端(逻辑上的,其实两端是对等的)。与TCP不同的是这两端程序基本架构是相同的。因此对于基于UDP的Socket编程就不分服务器端与客户端。具体如下:

      a)建立一个DatagramSocket对象

      b)进入收发数据报包的循环,直到数据传送完毕。

        1)利用DatagramSocket处理接收到的数据

        2)利用DatagramSocket发送数据

      c)释放Socket连接

    请看示例代码:

    server端:

    import java.io.IOException;
    import java.net.DatagramPacket;
    import java.net.DatagramSocket;
    import java.net.SocketException;
    import java.util.Date;
    
    public class Server_udp {
    
    	public static void main(String[] args) {
    		try {
    			DatagramSocket ds = new DatagramSocket(3000);
    			System.out.println("waitting for connecting");
    
    			while (true) {
    				byte[] buf = new byte[256];
    				//接收
    				DatagramPacket p = new DatagramPacket(buf, buf.length);
    				ds.receive(p);
    				System.out.println("client:" + new String(p.getData()));
    				// sending for next
    				//发送
    				buf = new Date().toString().getBytes();
    				p = new DatagramPacket(buf, buf.length, p.getAddress(),
    						p.getPort());
    				ds.send(p);
    //				System.out.println("already send...");
    			}
    		} catch (SocketException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		} catch (IOException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    	}
    }
    

    Client端:

    import java.io.IOException;
    import java.net.DatagramPacket;
    import java.net.DatagramSocket;
    import java.net.InetAddress;
    
    public class Client_udp {
    	public static void main(String[] args) throws IOException {
    		DatagramSocket ds = new DatagramSocket();
    		// 发送
    		byte[] buf = new byte[256];
    		buf = "hello".getBytes();
    		DatagramPacket p = new DatagramPacket(buf, buf.length,
    				InetAddress.getByName("localhost"), 3000);
    		ds.send(p);
    		// 接收
    		p = new DatagramPacket(buf, buf.length);
    		ds.receive(p);
    		System.out.println("server:" + new String(p.getData()));
    		ds.close();
    	}
    }
    

      

  • 相关阅读:
    【LVS 】NAT方式实现过程
    【 LVS 】类型及算法
    [ 总结 ] RHEL6/Centos6 使用OpenLDAP集中管理用户帐号
    [ 手记 ] 关于tomcat开机启动设置问题
    [ 总结 ] nginx 负载均衡 及 缓存
    Mac
    Swift
    Swift
    Cocoapods
    Swift
  • 原文地址:https://www.cnblogs.com/byghui/p/2939966.html
Copyright © 2020-2023  润新知