• j2se--Socket沟通


           第一次接触Socket课程设计大二,我在做一个图书馆管理系统。源代码是从互联网上下载,代码天天磨,隐约中记得有Socket这么一个单词。

       第二次是去年代表学校參加“河北省电子信息职业技能大赛”,接受曹建新师哥的培训。建新师哥当时用手机Android软件做client。通过局域网向电脑端server传输手机录入的信息。当时我非常诧异,client是Android平台,server是.Net平台,这两种平台是怎样在局域网内进行通信的呢?建新师哥的回答是:“通过Socket。把数据打包成JSON格式进行传输。”从此对Socket的认识便有了一种高大上的感觉。

       第三次接触是通过马士兵老师的视频,这次瞬间感觉Socket--So Easy。这也验证了米老师的那句话:不怕不知道,就怕不知道

       Socket通信分为serverSocket即ServerSocket和clientSocket。

       在server端,通信前须要建立和client的通信通道,建立对client通信port号的监听;在client,通信前须要定义进行通信的主机IP和port号,创建通信通道。两者都准备完成,以下就能够进行通信了。

       server端代码:

    import java.io.DataInputStream;
    import java.io.DataOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.net.ServerSocket;
    import java.net.Socket;
    
    public class TCPServer {
    
    	public static void main(String[] args) {
    		//创建向client数据传输的通道
    		InputStream in = null;
    		//创建从client接收数据的通道
    		OutputStream out = null;
    
    		try {
    			//建立和client的通信,并定义通信端口
    			ServerSocket ss = new ServerSocket(5888);
    			//监听client提交的请求
    			Socket socket = ss.accept();
    			in = socket.getInputStream();
    			out = socket.getOutputStream();
    			//在字节流的基础上进行包装数据流
    			DataInputStream dis = new DataInputStream(in);
    			DataOutputStream dos = new DataOutputStream(out);
    
    			//接收client提交的请求
    			String s = null;
    			if ((s = dis.readUTF()) != null) {
    				System.out.println(s);
    				System.out.println("from:" + socket.getInetAddress());
    				System.out.println("port:" + socket.getPort());
    			}
    
    			//向client数据传输
    			dos.writeUTF("hi,hello");
    			dos.close();
    			dis.close();
    			socket.close();
    		} catch (IOException e) {
    			e.printStackTrace();
    		}
    	}
    }
    
            因为数据流的readUTF()方法和writeUTF()方法都是堵塞式,所以当A向B发送数据后。假设B没有响应。A是无法继续发送数据的,仅仅能傻傻的等待。这个过程好比TCP/IP协议的三次握手,1:A呼叫B,“我是A。收到请回答?”;2:B回应A,“我是B,收到”;3:A继续说。“我想请你吃饭,你有时间吗?”。以下A和B就能够进行通信了。

       server端代码有了,以下分享client代码:

    import java.io.DataInputStream;
    import java.io.DataOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.net.Socket;
    import java.net.UnknownHostException;
    
    public class TCPClient {
    	public static void main(String[] args) {
    		//创建向server数据传输的通道
    		InputStream in = null;
    		//创建从server接收数据的通道
    		OutputStream out = null;
    		try {
    			//定义进行通信的主机IP和端口号
    			Socket socket = new Socket("localhost", 5888);
    			in = socket.getInputStream();
    			out = socket.getOutputStream();
    			//在字节流的基础上进行包装数据流
    			DataInputStream dis = new DataInputStream(in);
    			DataOutputStream dos = new DataOutputStream(out);
    			//向server提交数据
    			dos.writeUTF("hey");
    			//接收从server返回的数据
    			String s = null;
    			if ((s = dis.readUTF()) != null) {
    				System.out.println(s);
    			}
    			dos.close();
    			dis.close();
    			socket.close();
    		} catch (UnknownHostException e) {
    			e.printStackTrace();
    		}catch(IOException e){
    			e.printStackTrace();
    		}
    	}
    }
    
          通过这个简单的小Demo,我们就能够清晰的观察到Socket是怎样在server端和client进行通信的。

        J2SE是JavaWeb和J2EE的基础,异常处理、IO通道、线程、网络编程、GUI编程又是J2SE的基础,所以学好Socket非常有必要。

        席慕蓉说过一句名言:前世的五百次回眸才干换得今生的一次擦肩而过。所以对于以后的每次擦肩而过都应该认真对待。不要像我。和Socket都擦肩而过好多次了,今天才最终认识它。

    版权声明:本文博客原创文章,博客,未经同意,不得转载。

  • 相关阅读:
    python IDE安装-mac
    tokudb引擎安装-2
    MariaDB10.2.X-新特性2-支持check约束and with as
    MariaDB10.2.X-新特性1-支持分析函数
    MySQL5.7表空间加密
    MySQL 5.7 SYS scheme解析
    tcpdump抓SQL
    pt-online-schema-change
    查看锁信息
    onlineDDL测试
  • 原文地址:https://www.cnblogs.com/mfrbuaa/p/4651495.html
Copyright © 2020-2023  润新知