您的当前位置:首页正文

JAVA学习之TCP网络编程篇,Socket使用

来源:筏尚旅游网
JAVA学习之TCP⽹络编程篇,Socket使⽤

ServerSocket 此类实现服务器套接字。 ServerSocket常⽤的构造⽅法有以下⼏个,ServerSocket()

创建⾮绑定服务器套接字。

ServerSocket(int port)

创建绑定到特定端⼝的服务器套接字。

ServerSocket(int port, int backlog)

利⽤指定的 backlog 创建服务器套接字并将其绑定到指定的本地端⼝号。ServerSocket(int port, int backlog, InetAddress bindAddr)

使⽤指定的端⼝、侦听 backlog 和要绑定到的本地 IP 地址创建服务器。

Socket 此类实现客户端套接字(也可以就叫“套接字”)。Socket类常⽤的构造⽅法有以下⼏个 Socket()

通过系统默认类型的 SocketImpl 创建未连接套接字

Socket(InetAddress address, int port)

创建⼀个流套接字并将其连接到指定 IP 地址的指定端⼝号。

Socket(InetAddress address, int port, InetAddress localAddr, int localPort) 创建⼀个套接字并将其连接到指定远程地址上的指定远程端⼝。

Socket(Proxy proxy)

创建⼀个未连接的套接字并指定代理类型(如果有),该代理不管其他设置如何都应被使⽤。Socket(SocketImpl impl)

使⽤⽤户指定的 SocketImpl 创建⼀个未连接 Socket。Socket(String host, int port)

创建⼀个流套接字并将其连接到指定主机上的指定端⼝号。 Socket(String host, int port, InetAddress localAddr, int localPort) 创建⼀个套接字并将其连接到指定远程主机上的指定远程端⼝。这两个类常⽤到的⽅法有getInputStream()

返回InputStream此套接字的输⼊流。 getOutputStream()

返回OutputStream此套接字的输出流。

JAVA 中利⽤TCP协议进⾏通信的应⽤程序是有主次之分的,⼀个称为服务端,⼀个称为客户端,两者的功能编写⽅法不⼤⼀样,其中的服务端⽤的是ServerSocket和Socket类,⽽客户端⽤的是Socket。它们之间交互的过程⼤致如下:

1、服务端程序先创建⼀个ServerSocket,然后调⽤该类的accept()⽅法,侦听并接受到此套接字的连接。2、客户端程序创建⼀个Socket,请求与服务端建⽴连接。

3、服务端接收到客户端的连接请求,accept()⽅法就会返回⼀个Socket对象,并从中取得客户端发来的数据。

使⽤时服务端ServerSocket的accept()⽅法如果侦听到数据来的时候,返回的Socket对象是与请求连接的客户端的Socket相连的,其中服务端Socket对象得到的OutputStream对象是客户端Socket对象的InputStream对象,⽽

服务端Socket对象得到的InputStream对象是客户端Socket对象的OutputStream对象,其中的输⼊输出流对象,是相对⽽说的。就好像打电话⼀样,你的听筒⾥⾯听到的内容,是别⼈话筒⾥⾯说出来的话,⽽你在话筒⾥⾯说话时,别⼈则是在他的听筒⾥听到你说话的内容的。

与UDP协议不同,TCP协议是⼀种可靠的连接协议,TCP可以保证数据从⼀端送到另⼀端的时候,能够保证数据的正确性⽽且接收到的数据和发送出来的数据的顺序是⼀样的。⽽UDP协议发送的数据则有可以丢失,或者顺序不⼀定按发出时的顺序⼀样。TCP协议适合那些可靠性要求⽐较⾼的场合。应该看使⽤场合来决定使⽤TCP还是UDPTCP⽹络编程如果不涉及太多其它业务的话,单只是来回服务端和客户端的数据来回,其实还是挺简单的。这⾥是简单的⽰例代码,其中⼀个是客户端的,⼀个是服务端的程序的代码

//⾸先是服务端的

import java.io.*;import java.net.*;public class Server {

public static void main(String[] args) throws Exception {// 创建绑定到特定端⼝10000的服务器套接字。

ServerSocket serverSocket = new ServerSocket(10000);System.out.println(\"Server is open\");

// 侦听并接受对应此套接字的客户端连接。Socket socket = serverSocket.accept();// 取得输⼊流对象

InputStream in = socket.getInputStream();byte[] buf = new byte[1024];int len = in.read(buf);

String inData = new String(buf, 0, len);

String ip = socket.getInetAddress().getHostAddress();

System.out.println(\"Client data is:\" + inData + \" and ip is:\" + ip);// 取得⼀个输出流对象

OutputStream out = socket.getOutputStream();// 把信息写到输出流

out.write(\"Hi Client I had got you message yeah!\".getBytes());// 关闭对象 socket.close();

serverSocket.close();}}

//其次这个是客户端的代码

import java.io.*;import java.net.*;public class Client {

public static void main(String[] args) throws Exception {

// 创建⼀个流套接字并将其连接到127.0.0.1的指定端⼝号10000上。Socket socket = new Socket(\"127.0.0.1\", 10000);// 取得⼀个输出流

OutputStream out = socket.getOutputStream();

// 把数据写⼊输出流就可以了,不⽤显式的数据发送⽅法的,因为⼀旦连接上了服务端之后// 在Socket没有关闭之前,连接都是有效的,并且数据可以在服务端的InputStream取到out.write(\"Hi Server,this is Client.How are you.\".getBytes());// 取得⼀个输⼊流,⽤以取到服务端发过来的信息InputStream in = socket.getInputStream();byte[] buf = new byte[1024];int len = in.read(buf);

String inData = new String(buf, 0, len);

System.out.println(\"the Server back message is: \" + inData);socket.close();}}

以上的代码都可以直接使⽤,可以看到,如果只是单纯连接服务端和客户端的话,涉及到的类和⽅法并不是很多,⽽且⽐UDP时更简单,只是输⼊输出流的地⽅有点不好理解,不过多写⼏次就好了。

因篇幅问题不能全部显示,请点此查看更多更全内容