Java 网络编程(五) 使用TCP/IP的套接字(Socket)进行通信
链接地址:http://www.cnblogs.com/mengdd/archive/2013/03/10/2952616.html
使用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通信
(1)建立Socket连接
(2)获得输入/输出流
(3)读/写数据
(4)关闭输入/输出流
(5)关闭Socket
通信程序测试
建立服务器端和客户端如下:
TcpServer
TcpClient
然后先运行服务器端,再运行客户端,可以看到,运行客户端之后输出服务器端的后续代码。
表明连接建立后才会往下执行。
一个比较简陋的通信程序:
TcpServer2
TcpClient2
先运行服务器,再运行客户端。之后可以在服务器和客户端的控制台上进行输入操作,另一端将会收到输入的信息并输出。
使用线程实现服务器端与客户端的双向通信
用两个线程,一个线程专门用于处理服务器端的读,另一个线程专门用于处理服务器端的写。
客户端同理。
代码如下,程序共有六个类。
服务器端和其输入输出线程:
MainServer
ServerInputThread
ServerOutputThread
客户端和其输入输出线程(其输入输出线程和服务器端的完全一样):
MainClient
ClientInputThread
ClientOutputThread
经测试成功。即从服务器端控制台输入,可以从客户端接收到并输出;也可以反过来,从客户端控制台输入,那么服务器端会同时输出。
多个客户端的程序实验
可以启动多个客户端,同时与服务器进行交互。这里还是采用上面的MainServer和MainClient及其输入输出线程代码。
这部分做实验的时候需要使用命令行,因为Eclipse里面每次Run的时候都会重新启动程序,即想要Run第二个客户端的时候总是先关闭第一个客户端(因为它们运行的是同一个程序),这样,即只能有一个客户端存在。
在命令行运行的方法如下:
因为源文件带有包名,所以编译采用:
javac –d . 源文件名.java
注意d和.之间有一个空格。
可以使用通配符编译所有的源文件,即使用:
javac –d . *.java
编译之后执行:
java 完整包名+类名
先启动服务器程序,之后新开命令行窗口启动客户端程序,结果如下:
(一个客户端时交互正常)
(多个客户端交互异常)
经实验,发现在一个服务器多个客户端的情况下,客户端可以流畅地向服务器发送信息,但是当服务器发送信息时,就会出现问题,并不是每一个客户端都能收到信息。
如图中,当服务器发送语句时,第一个客户端收到了(并且是发送后多按下一个回车才收到),第二个客户端没有收到。
后面试验了几个语句都是这样:
实现服务器支持多客户机通信
服务器端的程序需要为每一个与客户机连接的socket建立一个线程,来解决同时通信的问题。
服务器端应该管理一个socket的集合。
即要完成一个功能完善的客户端和服务器通信程序,代码还是需要进一步完善的。
参考资料
圣思园张龙老师Java SE系列视频教程。
Java 网络编程(五) 使用TCP/IP的套接字(Socket)进行通信的更多相关文章
- 从零探索Java网络编程01之 TCP/IP 与 Socket
最近完成了几项比较简单的项目, 终于是在996里偷了点闲暇时光, 想着来研究研究些啥吧? 一个普通的控制台日志映入了我的眼帘(孽缘呀): (图中使用 SpringBoot 的 log4j 来输出日志 ...
- python 之 网络编程(基于TCP协议的套接字通信操作)
第八章网络编程 8.1 基于TCP协议的套接字通信 服务端套接字函数 s.bind() 绑定(主机,端口号)到套接字 s.listen() 开始TCP监听 s.accept() 被动接受TCP客户的连 ...
- java网络编程(二)可中断套接字
参考资料:java核心技术 卷II 为中断套接字操作,可使用java.nio包提供的SocketChannel类.可以使用如下方式打开SocketChannel: SocketChannel chan ...
- Android网络编程系列 一 TCP/IP协议族
在学习和使用Android网路编程时,我们接触的仅仅是上层协议和接口如Apache的httpclient或者Android自带的httpURlconnection等等.对于这些接口的底层实现我们也有必 ...
- 用java网络编程中的TCP方式上传文本文件及出现的小问题
自己今天刚学java网络编程中的TCP传输,要用TCP传输文件时,自己也是遇到了一些问题,抽空把它整理了一下,供自己以后参考使用. 首先在这个程序中,我用一个客户端,一个服务端,从客户端上传一个文本文 ...
- 网络编程(二)--TCP协议、基于tcp协议的套接字socket
一.TCP协议(Transmission Control Protocol 传输控制协议) 1.可靠传输,TCP数据包没有长度限制,理论上可以无限长,但是为了保证网络的效率,通常TCP数据包的长度不会 ...
- 网络编程(二)——TCP协议、基于tcp协议的套接字socket
TCP协议与基于tcp协议的套接字socket 一.TCP协议(流式协议) 1.可靠传输,TCP数据包没有长度限制,理论上可以无限长,但是为了保证网络的效率,通常TCP数据包的长度不会超过IP数据包的 ...
- 使用TCP/IP的套接字(Socket)进行通信
http://www.cnblogs.com/mengdd/archive/2013/03/10/2952616.html 使用TCP/IP的套接字(Socket)进行通信 套接字Socket的引入 ...
- 《Unix 网络编程》08:基本UDP套接字编程
基本UDP套接字编程 系列文章导航:<Unix 网络编程>笔记 UDP 概述 流程图 recvfrom 和 sendto #include <sys/socket.h> ssi ...
随机推荐
- [原]性能优化之Hibernate缓存讲解、应用和调优
近来坤哥推荐我我们一款性能监控.调优工具--JavaMelody,通过它让我觉得项目优化是看得见摸得着的,优化有了针对性.而无论是对于分布式,还是非分布,缓存是提示性能的有效工具. 数据层是EJB3. ...
- java 操作配置文件 .properties
package com.dms.common; import java.io.File; import java.io.FileInputStream; import java.io.FileNotF ...
- codechef Chef and The Right Triangles 题解
Chef and The Right Triangles The Chef is given a list of N triangles. Each triangle is identfied by ...
- Javascript 基础编程练习一
Javascript 基础互动编程,这篇练习结合了function 函数名(), onclick 时间, prompt输入窗口, window.open和confirm窗口, 任务 1.新窗口打开时弹 ...
- STMP发送邮件被当垃圾邮件处理的解决方法
昨天使用了.Net通过smtp发送邮件的方式发送了一封邮件到自己的QQ邮箱,但是发送成功后并没有提示邮箱收到新的邮件,而且去收件箱里面也没有新增的邮件. 这让本人觉得奇怪,所以就觉得是否被当作垃圾邮件 ...
- 页面加载时,页面中DIV随之滑动出来;去掉页面滚动条
<head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8&quo ...
- Windows Server 2003 安装Sql Server 2005 问题处理
安装途中遇到: 问题1.无法找到产品Microsoft SQL Server Native Client的安装程序包.请使用安装包sqlncli.msi的有效副本重新安装? 答:安装SQL Serve ...
- python 备份脚本
import osimport timesource= r"out_res.txt"target_dir= r"F:\python\Doc"target=tar ...
- 理解ROS话题
首先需要打开一个终端在里面运行roscore: roscore 再打开一个终端,在里面运行一个turtlesim_node节点: rosrun turtlesim turtlesim_node 打开另 ...
- Django Web开发【3】创建网络收藏夹
这一节我们将继续一个创建网络收藏夹应用,并学习视图.模型以及模板的处理过程. Django是一个MVC开发框架,但是它的控制器对应的为view,而视图对应为模板(template),模型对应model ...