您的位置:首页 > 理论基础 > 计算机网络

Java基于TCP/IP的Socket通信

2016-02-25 12:29 645 查看
基于TCP/IP的Socket通信通过输入流和输出流来传递数据,在这之前必须实现服务端和客户端的连接,客户端和服务端三次握手确认连接后,即可通过对应的流进行通信,基于TCP/IP的Socket通信的三次握手确认使得通信相对安全可靠。

[b]Socket客户端由ServerSocket类实现[/b]

ServerSocket类的的一些方法:

构造方法

ServerSocket(int port)


Creates a server socket, bound to the specified port.

创建一个socket服务并绑定特定的端口。

注:

端口号为0~65535,其中0~1023为系统保留端口,所以可以任意取1024~65535内的端口。

Socket accept() throws IOException


Listens for a connection to be made to this socket and accepts it.

监听并接受socket连接。

注:

方法返回一个客户端连接的Scoket对象,通过这个对象可获取输入流输出流与客户端通信;

当线程调用accept()方法而没有socket连接时,线程将处于阻塞状态;

若在调用accept()方法前调用setSoTimeOut(int timeout)设定了等待时间,且在等待时间过后未有socket连接,则方法抛出SocketTimeoutException异常(setSoTimeOut(int) 参数为毫秒)。

void close()


Closes this socket.

关闭这个socket

InetAddress getInetAddress()


Returns the local address of this server socket.

返回本地socket服务的地址(InetAddress对象)

boolean isBound()


Returns the binding state of the ServerSocket.

boolean isClosed()


Returns the closed state of the ServerSocket.

[b]Socket客户端通过创建Socket类对象与服务端连接[/b]

Socket类的一些方法:

构造方法

Socket(InetAddress address, int port)


Socket(String host, int port)


Creates a stream socket and connects it to the specified port number at the specified IP address.

创建一个流socket并连接到特定的IP地址的特定端口

注:

前一个构造方法中InetAddress对象可由InetAddress类的几个静态方法获得;

后一个构造方法中String host可以是主机名或者是IP地址。

void close()


Close this socket.

InetAddress getInetAddress()


Returns the address to which the socket is connected.

返回socket连接到的地址(InetAddress对象)

InputStream getInputStream()


OutputStream getOutputStream()


获取输入流和输出流

void shutdownInput()


void shutdownOutput()


关闭输入流和输出流

以上引用的内容来自Java API 1.8.0

更多相关的类和方法可查询Java API

[b]服务端实现[/b]

创建ServerSocket实例,启动服务器

等待客户端连接

获取输入流输出流进行通信

关闭相关资源

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;

public class Server {

public void start() throws IOException {//将异常抛出

//创建ServerSocket实例,绑定8000端口,启动服务
ServerSocket server = new ServerSocket(8000);
InetAddress address = InetAddress.getLocalHost();
System.out.println(address + "服务器启动");

//等待客户端连接,在有客户端连接前线程阻塞
Socket socket = server.accept();

//获取输出流
InputStream input = socket.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(input));
String line;
while((line = reader.readLine()) != null){
System.out.println(line);
}

//关闭资源
socket.shutdownInput();
reader.close();
socket.close();

//关闭服务
server.close();
}

public static void main(String[] args) {
try {
new Server().start();
} catch (IOException e) {
e.printStackTrace();
}
}

}


[b]客户端实现[/b]

创建Socket实例,连接到指定服务端

获取输入流和输出流进行通信

关闭相关资源

import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;

public class Client {

public void start() throws IOException {//将异常抛出

//创建Socket实例,连接到localhost的8000端口
Socket socket = new Socket("localhost", 8000);

//获取输出流
OutputStream output = socket.getOutputStream();
PrintWriter writer = new PrintWriter(output);
writer.write("客户端连接");
writer.flush();

//关闭资源
socket.shutdownOutput();
writer.close();
socket.close();

}

public static void main(String[] arg){
try {
new Client().start();
} catch (IOException e) {
e.printStackTrace();
}
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java socket