Java中Socket网络通信原理
来源:互联网 发布:巫师3新手必知 编辑:程序博客网 时间:2024/05/27 16:43
Socket的基本概念
1.建立连接
当需要建立网络连接时,必须有一台机器运行一个程序,随时等候连接,而另一端的程序这对其发出连接请求。这一点同电话系统类似——必须有一方拨打电话,而另一方必须等候电话连通。建立连接的过程为:
(1)现在服务器端生成一个ServerSocket实例对象,随时监听客户端的连接请求。
(2)当客户端需要连接时,相应地要生成一个Socket实例对象,并发出连接请求,其中host参数指明该主机名,port#参数指明该主机端口号。
(3)服务器端通过accept()方法接收到客户端的请求后,开辟一个接口与之进行连接,并生成所需的I/O数据流。
(4)客户端和服务器端的通信都是通过一对InputStream和OutputStream进行的,通信结束后,两端分别关闭对应的Socket接口。
2.连接地址
打电话时,呼叫方必须事先知道所需拨打的号码,而程序建立网络连接时,也同样需要知道地址或主机名称。另外,网络连接还需要一个端口号(可以将其当作电话的分机号),连接到正确的主机之后,需要对该连接确认特定口令。某些情况下,还需要使用一个扩展号码与网络计费系统相连,于是相应地要有一个特定端口号用于连接计费程序。
3.端口号
在TCP/IP系统中,端口号由16位二进制整数组成,即在0-65535之间。实际应用中,前1024个端口号已经预先定义为一些特定服务,因此一般不能使用,除非想同这些服务器进行连接(如Telnet,SMTP,mail,ftp等)。在两个程序连接之前,彼此之间必须达成一致,即由客户端负责初始化连接,而服务器随时等候请求。只有客户端和服务器端指定端口号一致时连接才会建立。如果系统中两个程序所用端口号不一致,这连接无法建立。
4.网络连接模式
在Java中,TCP/IP接口的连接是由java.net包中的类实现的
每个server端都拥有一个端口号,一台机器上如果运行多个服务,这可能对应多个端口号。通信结束后,两端分别关闭对应的Socket接口,而不影响其他的端口。
Socket通信的基本步骤
使用Socket方式进行网络通信的程序基本结构都是类似的,无论一个Socket通信程序的功能多么齐全、程序多么复杂,其基本结构都是一样的。客户端与服务器端进行通信的过程都包括以下四个基本步骤:
(1)在服务器端指定一个用来等待连接的端口号,在客户端规定一个主机和端口号,从而在客户端和服务器端创建Socket/ServerSocket实例。
(2)打开连接到Socket的输入输出流。
(3)利用输入输出流,按照一定的协议对Socket进行读写操作。
(4)关闭输入输出流和Socket
通常,程序员的主要工作时针对所要完成的功能砸器第(3)步进行编程,第(1)、(2)、(4)步对所有的通信程序来说几乎都是一样的。
Socker通信的程序设计
1.服务器端程序
TCP/IP服务器端应用程序是通过Java语言中提供的ServerSocket和Socket这两个有关网络的类来实现的。而ServerSocket类除了建立一个Server之外,还通过accept()方法提供了随时监听客户端连接请求的功能,它的构造方法有以下两种。
ServerSocket(int port)
ServerSocket(int port,int backlog)
其中port是指连接中对方的端口号,backlog则表示服务器端所能支持的最大连接数。下面的程序用来监听客户端应用程序建立连接的请求,并在连接建立后向客户端发送信息。
Java中的网络通信时通过Socket实现的,Socket分为ServerSocket和Socket两大类,ServerSocket用于服务器端,可以通过accept方法监听请求,监听请求后返回Socket,Socket用于完成具体数据传输,客户端也可以使用Socket发起请求并传输数据。ServerSocket的使用可以分为三步:
- 创建ServerSocket。ServerSocket的构造方法有5个,其中最方便的是ServerSocket(int port),只需要一个port就可以了。
- 调用创建出来的ServerSocket的accept方法进行监听。accept方法是阻塞方法,也就是说调用accept方法后程序会停下来等待连接请求,在接受请求之前程序将不会继续执行,当接收到请求后accept方法返回一个Socket。
- 使用accept方法返回的Socket与客户端进行通信
public class Server { public static void main(String[] args) { // TODO Auto-generated method stub try { //创建一个ServerSocket监听8080端口 ServerSocket server = new ServerSocket(8080); //等待请求 Socket socket = server.accept(); //接受请求后使用Socket进行通信,创建BufferedReader用于读取数据 BufferedReader is = new BufferedReader(new InputStreamReader(socket.getInputStream())); String line = is.readLine(); System.out.println("received frome client:" + line); //创建PrintWriter,用于发送数据 PrintWriter pw = new PrintWriter(socket.getOutputStream()); pw.println("this data is from server"); pw.flush(); //关闭资源 pw.close(); is.close(); socket.close(); server.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } }}
然后我们再看看客户端的Socket代码,Socket的使用也是一样,首先创建一个Socket,Socket的构造方法非常多,这里用的是Socket(String host, int port),把目标主机的地址和端口号传入即可(本实验代码中服务器和Client代码没有在同一台机器上,服务器的IP地址:192.168.6.42,所以如果读者在实验过程中ServerSocket和Client在同一主机下,那么Client中的IP地址需要更改为:127.0.0.1,Socket创建的过程就会跟服务器端建立连接,创建完Socket后,再创建Writer和Reader来传输数据,数据传输完成后释放资源关闭连接。
public class Client { public static void main(String[] args) { // TODO Auto-generated method stub String msg = "Client data"; try { //创建一个Socket,跟服务器的8080端口链接 Socket socket = new Socket("192.168.6.42",8080); //使用PrintWriter和BufferedReader进行读写数据 PrintWriter pw = new PrintWriter(socket.getOutputStream()); BufferedReader is = new BufferedReader(new InputStreamReader(socket.getInputStream())); //发送数据 pw.println(msg); pw.flush(); //接收数据 String line = is.readLine(); System.out.println("received from server" + line); //关闭资源 pw.close(); is.close(); socket.close(); } catch (UnknownHostException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } }}
最后先启动Server然后启动Client就可以完成一次Client和Server的通信。
ServerSocket中常用的构造函数及方法
构造函数:ServerSocket(intport) 这是一个构造方法,用于在当前的服务器默认的IP地址上监听一个指定的端口,即在指定的IP和端口创建一个ServerSocket对象
方法:
Socket accept()产生阻塞,监听指定的端口,直至有客户端发来连接请求
void close() 关闭当前ServerSocket
InetAddressgetInetAddress() 返回ServerSocket监听的,本机的IP地址
intgetLocalPort() 返回ServerSocket监听的,本机的IP地址上指定的端口号
intgetSoTimeout();void setSoTimeout(int timeout) 设置连接过程中没有得到相应的等待期限时间(TimeOut)
StringtoString() 以字符串的方式返回ServerSocket监听的,本机的IP地址及其端口号
Socket类中常用的构造函数和方法
构造函数:Socket(InetAddressaddress,int port) 用于创建一个链接,向指定的IP地址上指定的端口的服务器端程序发送连接请求
Socket(Stringhost,int port) 同上,但该方法允许通过主机名字符串向服务器发送连接请求
方法:
void close()关闭当前的Socket 连接
InetAddressgetInetAddress() 返回Socket建立了连接的服务器的IP地址
InputStreamgetInputStream() 返回当前Socket的输入流
OutputStreamgetOutStream() 返回当前Socket的输出流
InetAddressgetLocalAddress() 返回和Socket进行连接的本地的IP地址
intgetLocalPort() 返回和Socket进行连接的本地的端口号
int getPort() 返回和Socket建立了连接的服务器的端口号
intgetSoTimeOut();void setSoTimeOut(int timeout) 设置连接过程中没有得到相应的等待期限时间
String toString() 以字符串的方式返回Socket的属性信息
Socket类的构造方法包括以下几种:
public Socket(String host,int port)
public Socket(InetAddress address,int port)
public Socket(String host,int port,InetAddresslocalAddr,int localPort)
public Socket(InetAddress host,int port, InetAddress,localAddr,intlocalPort)
在JDK1.1以前,Socket类可同时用于TCP/UDP通信:
public Socket(String host,int port,Booleanstream)
public Socket(InetAddress host,int port, Booleanstream)
Socket类的输入/输出流管理包括以下方法:
public InputStream getInputStream()
public void shutdowmInput()
public OutputStream get OutputStream ()
public void shutdowmOutput()
以上这些方法都将抛出IOException异常,程序中需要捕获并处理。
关闭Socket的方法为:
public void close() throws IOException
设置/获取Socket数据的方法为:
public InetAddress getInetAddress()
public int getPort()
public void setSoTimeout(int timeout)
这些方法都将抛出SocketException异常,程序中需要捕获并处理。
ServerSocket类的构造方法包括以下几种:
public ServerSocket (int Port)
public ServerSocket (int Port,int backlog):支持指定数目的连接
public ServerSocket (int Port,intbacklog,InetAddress bindAddr)
这些方法都将抛出IOException异常,程序中需要捕获并处理。
public Socket accept():等待客户端的连接
public void close():关闭Socket
设置/获取Socket数据的方法包括:
public InetAddress get InetAddress ()
public int getLocalPort()
public void setSoTimeout(int timeout)
这些方法都将抛出SocketException异常,程序中需要捕获并处理。
- Java中Socket网络通信原理
- Java中Socket网络通信
- Java网络通信Socket
- java 网络通信 socket
- Java Socket通信原理简介
- 网络中进程通信-----socket
- Java 中 Socket 通信
- java中socket通信
- Java中Socket通信
- JAVA的网络通信----SOCKET
- java Socket网络通信简介
- Socket网络编程及其通信原理
- 【java学习】Java网络通信基石Socket
- 某科学的超 Java网络编程:Socket通信原理及实例学习
- java中Socket相互通信
- java Socket通信(一)原理
- 利用Socket原理Java实现双方通信
- Android中基于Socket的网络通信
- 十、内部类的认识
- web.xml文件中的7个错误的安全配置
- UnsupportedClassVersionError
- Android Camera 系统架构源码分析(5)---->Camera数据Buf的传递方式及相关类
- svn安装
- Java中Socket网络通信原理
- 简述CGI
- 论文_autosar
- openwrt 编译时 mbed TLS libraries not found 问题解决记录
- 机器学习实战Ch02_k近邻算法的运行
- 欢迎使用CSDN-markdown编辑器
- c# ExecuteScalar使用
- python3 表示时间、日期——定时器
- 谈谈对Spring AOP的认识