TCP通用服务器(TCP服务端,接收客户端内容,然后输出)
网络层的IP可以唯一标识网络中的主机,而传输层的协议、端口这两个东西可以表示主机中的进程(也就是网络应用程序)。
套接字:
套接字概述:网络通信使用IP地址标识网络中的主机,使用端口号标识服务器上的进程。当两个程序需要通信时,它们可以通过使用Socket类建立套接字对象并连接在一起(端口号 + IP地址组合得出一个网络套接字)。
ServerSocket类
方法签名 | 方法说明 |
---|---|
ServerSocket(int port) | 创建绑定到指定端口的服务器套接字 |
ServerSocket(int port, int backlog) | 创建服务器套接字并将其绑定到指定的本地端口号,并指定了积压。 |
Socket accept() | 侦听要连接到此套接字并接受它 |
bind(SocketAddress endpoint) | 将ServerSocket绑定到特定地址(IP地址和端口号) |
InetAddress getInetAddress() | 返回此服务器套接字的本地地址 |
void close() | 关闭此套接字 |
int getLocalPort() | 返回此套接字正在侦听的端口号 |
Socket类
方法签名 | 方法说明 |
---|---|
Socket(InetAddress address, int port) | 创建流套接字并将其连接到指定IP地址的指定端口号 |
Socket(String host, int port) | 创建流套接字并将其连接到指定主机上的指定端口号 |
void bind(SocketAddress bindpoint) | 将套接字绑定到本地地址 |
void connect(SocketAddress endpoint) | 将此套接字连接到服务器 |
InetAddress getInetAddress() | 返回套接字所连接的地址 |
InputStream getInputStream() | 返回此套接字的输入流 |
OutputStream getOutputStream() | 返回此套接字的输出流 |
TCP服务端:
ServerSocket对象与服务器端套接字:为了能使客户端成功地连接到服务器,服务器必须建立一个ServerSocket对象,该对象通过将客户端的套接字对象和服务器端的一个套接字对象连接起来,从而达到连接的目的。
ServerSocket的构造方法:ServerSocket(int port) throws IOException.
当建立了ServerSocket的对象后,就可以使用方法accept()将客户端的套接字和服务器的套接字连接起来。
ServerSocket server = new ServerSocket(8888);
Socket client = server.accept();
accept()方法返回一个和客户端Socket对象相连接的Socket对象sc,sc驻留在服务器端。sc调用getOutputStream()获得的输出流将指向客户端的输入流。同样,调用getInputStream()获得的输入流将指向客户端的输出流。
注意:从文件中读取数据时,所有的数据都已经在文件中了。而使用套接字连接时,可能在另一端数据发送之前,就已经开始读取了,这时,就会阻塞本线程,直到该读取方法成功读取到信息,本线程才继续执行后续的操作。accept()方法也会阻塞线程的执行,直到接收到客户的呼叫。
建立连接后,服务器端的套接字对象调用getInetAddress()方法获取客户端的IP地址和域名。客户端的套接字对象调用getInetAddress()方法获取服务器的IP地址和域名。通信完毕后,套接字应使用close()方法关闭套接字连接。
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
public class HttpServer{
public static void main(String[] args) throws IOException {
ServerSocket server = new ServerSocket(8888);
System.out.println("服务器启动了....");
boolean isShow=true;
while (true){
try {
Socket client = server.accept();
// getInetAddress()获取客户端的IP地址和域名
// getLocalHost()获取本机的地址
String clientName=client.getInetAddress().getLocalHost().toString();
if(isShow){
System.out.println("客户端:"+clientName+"已连接到服务器");
}
isShow=false;
BufferedReader br = new BufferedReader(new InputStreamReader(client.getInputStream()));
String word = br.readLine();// word 客户端发送来的消息
if(null != word){
System.out.println("客户端输入的是:"+word+",服务器响应的是:"+word);
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(client.getOutputStream()));
bw.write(word+"\n");
bw.flush();
}
} catch (IOException e) {
e.printStackTrace();