Java使用ServerSocket类和Socket类可以实现TCP通信。
1、ServerSocket此类实现服务器套接字。服务器套接字等待请求通过网络传入,它基于该请求执行某些操作,然后可能向请求者返回结果。
accept():侦听并接受到此套接字的连接。
bind(SocketAddress endpoint) :将 ServerSocket 绑定到特定地址(IP 地址和端口号)。
close():关闭此套接字.
2、Socket
此类实现客户端套接字。
bind(SocketAddress bindpoint) :将此套接字绑定到本地地址。
connect(SocketAddress endpoint) : 将此套接字连接到服务器。
connect(SocketAddress endpoint, int timeout) :将此套接字连接到服务器,并指定一个超时值。
close() : 关闭此套接字。
getInputStream():返回此套接字的输入流。
getOutputStream():返回此套接字的输出流。
getInetAddress():返回套接字连接的地址。
getPort() : 返回此套接字连接到的远程端口。
getRemoteSocketAddress() :返回此套接字连接的远端端点的地址,如果未连接则返回 null。
3、Server端
Server端建立一个实现通信的服务器端点,然后等待Cient端发送的请求:
1. 创建一个ServerSocket实例,绑定到指定端口。该实例用来在指定端口监听Cient端的连接请求。
2. 调用ServerSocket实例的accept()方法来监听Cient端的连接请求,当监听到Client端请求时返回Socket实例,建立了一个和Cient端的新连接。
3.通过返回的socket实例的getInputStream()和getOutputStream()方法获取InputStream和OutputStream分别读和写数据。
4.调用ServerSocket实例的close()方法关闭与Client端的连接。
package com.server;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
private int port;
private Socket socket;
private InputStream in;
private OutputStream out;
/**
* 构造方法
* @param port
*/
public Server(int port){
this.port=port;
}
/**
* 创建服务器对象,并监听客户端,以获取与客户端的连接对象
* @return 与客户端的连接对象
*/
public void createServer(){
try {
ServerSocket server=new ServerSocket(port);
System.out.println("服务器已经创建好,等待客户端的连接。。。");
while(true){
socket=server.accept();
//启动一个线程对象来处理与某一个客户端聊天
new Thread(){
public void run(){
try{
//获取客户端的ip
String ip = socket.getRemoteSocketAddress().toString();
System.out.println("客户端ip为:"+ip);
//从连接对象上获取输入、输出流
out = socket.getOutputStream();
in = socket.getInputStream();
//聊天
chat(ip);
}catch(Exception e){
e.printStackTrace();
}
}
}.start();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* 聊天方法
*/
public void chat(String ip) throws Exception{
String hello = "welcome to chatroom!";
sendMsg(hello);
String msgFromClient = "";
//假定客户端每次发送 一行消息
while(!msgFromClient.equals("bye")){
String temp = "";
//每次读取一行消息
int i = in.read();
while(i!=13){//当读取到\n(换行符,ASC码值为13)就结束一条消息的读取
if(i!=10){
temp += (char)i;
}
i = in.read();
}
msgFromClient = temp;
System.out.println("客户端说:"+msgFromClient);
}
sendMsg("Good bye!");
socket.close();
}
/**
* 发送消息的方法
* @param msg
*/
public void sendMsg(String msg) throws Exception{
out.write((msg+"\r\n").getBytes());
}
public static void main(String[] args) {
Server server=new Server(9090);
server.createServer();
}
}
4、Client端
Client端的请求过程:
1.创建Socket实例,通过指定的远程服务器地址和端口来建立连接。
2.通过Socket实例的getInputStream()和getOutputStream()方法获取InputStream和OutputStream来进行数据的读写。
3.调用socket实例的close方法,关闭连接。
package com.client;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;
public class Client {
private String IP;
private int port;
private InputStream in;
private OutputStream out;
public Client(String IP,int port){
this.IP=IP;
this.port=port;
}
public void chat() throws Exception{
try {
Socket socket=new Socket(IP,port);
in=socket.getInputStream();
out=socket.getOutputStream();
//接收服务端欢迎消息
System.out.println(receiveMsg());
//从控制台读取消息发送给服务端
Scanner scanner=new Scanner(System.in);
String str=scanner.nextLine();
while(!str.equals("bye")){
String msg=str+"\r\n";
out.write(msg.getBytes());
str=scanner.nextLine();
}
out.write(new String(str+"\r\n").getBytes());
//接收服务端欢送消息
System.out.println(receiveMsg());
socket.close();
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* 接收消息
* @return
*/
public String receiveMsg() throws Exception{
String str="";
try {
int i=in.read();
while(i!=13){
str+=(char)i;
i=in.read();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return str;
}
public static void main(String[] args) throws Exception{
Client client=new Client("localhost",9090);
client.chat();
}
}
运行结果:
服务端控制台输出:
服务器已经创建好,等待客户端的连接。。。
客户端ip为:/127.0.0.1:56620
客户端说:hello
客户端说:bye
客户端控制台输出:
welcome to chatroom!
hello
bye
Good bye!