zoukankan      html  css  js  c++  java
  • 使用TCP/IP的套接字(Socket)进行通信

     套接字Socket的引入

      为了能够方便地开发网络应用软件,由美国伯克利大学在Unix上推出了一种应用程序访问通信协议的操作系统调用socket(套接字)。

      socket的出现使程序员可以很方便地访问TCP/IP,从而开发各种网络应用程序。随着Unix的应用推广,套接字在编写网络软件中得到了极大的普及。后来,套接字又被引进了Windows等操作系统中。Java语言也引进了套接字编程模型。

    什么是Socket?

      Socket是连接运行在网络上的两个程序间的双向通讯的端点。

    使用Socket进行网络通信的过程

      服务器端程序将一个套接字绑定到一个特定的端口,并通过此套接字等待和监听客户的连接请求。

      客户端程序根据服务器程序所在的主机名和端口号发出连接请求。

      

      如果一切正常,服务器接受连接请求。并获得一个新的绑定到不同的端口地址的套接字。(不可能有两个程序同时占用一个端口)。客户端和服务器端通过读写套接字进行通信。

     

      使用ServerSocket和Socket实现服务器端和客户端的socket通信。

       其中:左边ServerSocket类的构造方法可以传入一个端口值来构建对象。accept()方法监听向这个socket的连接并接收连接。它将会阻塞直到连接被建立好。连接建立好后他会返回一个Socket对象。连接建立好后,服务器端和客户端的输入流和输出流就互为彼此,即一端的输出流是另一端的输入流。

      使用ServerSocket和Socket实现服务器和客户端的Socket通信流程:

    • 建立Socket连接
    • 获得输入/输出流
    • 读/写数据
    • 关闭输入/输出流
    • 关闭Socket

    测试客户端与服务器通信过程

    服务端程序:

    TcpServer

    客户端程序:

    TcpClient  

      先运行服务器端程序,在运行客户端,可以看到,运行客户端之后服务器端输出“Connected Successfully!”,表明连接建立之后才会往下执行。之后可以在服务器和客户端上进行输入操作,另一端将会收到输入的信息并输出。

    使用线程实现服务器与客户端的双向通信

      用两个线程,一个线程专门用于处理服务器端的读,另一个线程专门用于处理服务器端的写。客户端同理。代码如下,程序共有六个类。

      服务器和其输入输出线程:

    MainServer
    ServerInputThread
    ServerOutputThread 

       客户端和其输入输出线程(其输入输出线程和服务器的完全一样):

    MainClient
    ClientInputThread
    ClientOutputThread
    测试结果:

      服务器端打印信息

    Wait for Connect!
    Connect successfully!
    Wait for Connect!
    server --> hello
    client --> Hi

      客户端打印信息:

    server --> hello
    client --> Hi

    多个客户端的程序实验

      可以启动多个客户端,同时与服务器进行交互。这里还是采用上面MainServer和MainClient及其输入输出程序代码。

      这部分做实验的时候需要使用命令行,因为Eclipse里面每次Run的时候会重新启动程序,即想要Run第二个客户端的时候总是先关闭第一个客户端(因为它们运行的是同一个程序),这样,即只能有一个客户端存在。(或者你开多个Eclipse,多建几个workspace就行)

      在命令行运行的方法如下:

      因为源文件带有包名,所以编译采用:

      javac -d .源文件名.java

      注意d和.之间有一个空格。

      可以使用通配符编译所有的源文件,即使用:

      javac -d .*.java

      编译之后执行:

      java 完整包名+类名

      先启动服务器端程序,之后新开命令行窗口启动客户端程序,结果如下:  

    一个客户端时,客户端与服务器端交互正常

      经过实验,发现在一个服务器多个客户端的情况下,客户端可以流畅地向服务器发送消息,但是当服务器发送消息时,就会出现问题,并不是每一个客户端都能收到信息。如图中,当服务器发一条信息时候,两个客户端都没有收到,但是服务器再发一条时候时候,两个客户端各接收到一条信息。如图所示:

     两个客户端,一个服务器,交互出现异常

    实现服务器支持多客户机通信

      服务器端的程序要为每一个与客户机连接的socket建立一个线程,来解决通信通信问题。

      服务器应该管理一个socket的集合。

      既要完成一个功能完善的客户端和服务器通信程序,代码还是需要进一步完善的。(初学者还不知道怎么完善?)

    参考资料:

    http://www.cnblogs.com/mengdd/archive/2013/03/10/2952616.html

     

  • 相关阅读:
    JavaEE——SpringMVC(11)--拦截器
    JavaEE——SpringMVC(10)--文件上传 CommonsMultipartResovler
    codeforces 460A Vasya and Socks 解题报告
    hdu 1541 Stars 解题报告
    hdu 1166 敌兵布阵 解题报告
    poj 2771 Guardian of Decency 解题报告
    hdu 1514 Free Candies 解题报告
    poj 3020 Antenna Placement 解题报告
    BestCoder5 1001 Poor Hanamichi(hdu 4956) 解题报告
    poj 1325 Machine Schedule 解题报告
  • 原文地址:https://www.cnblogs.com/chuji1988/p/4257079.html
Copyright © 2011-2022 走看看