首先创建一个普通的maven项目,加入依赖:
<dependencies>
<dependency>
<groupId>io.netty</groupId>
<artifactId>netty-all</artifactId>
<version>4.1.6.Final</version>
</dependency>
</dependencies>
然后继续:
客户端:
import java.io.*;
import java.net.Inet4Address;
import java.net.InetSocketAddress;
import java.net.Socket;
public class Client {
public static void main(String[] args) throws IOException {
Socket socket = new Socket();
socket.setSoTimeout(3000); //超时时间
socket.connect(new InetSocketAddress(Inet4Address.getLocalHost(), 2000), 3000);
System.out.println("已发起链接");
System.out.println("客户端,IP:" + socket.getLocalAddress() + ",port:" + socket.getLocalPort());
System.out.println("服务器,IP:" + socket.getInetAddress() + ",port:" + socket.getPort());
try {
todo(socket);
} catch (IOException e) {
System.out.println("出现异常");
} finally {
socket.close();
System.out.println("客户端退出");
}
}
private static void todo(Socket socket) throws IOException{
InputStream in = System.in;
BufferedReader input = new BufferedReader(new InputStreamReader(in));
//得到Socket输出流,并转换为打印流
OutputStream outputStream = socket.getOutputStream();
PrintStream printStream = new PrintStream(outputStream);
//获取Socket的输入流
InputStream inputStream = socket.getInputStream();
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
boolean flag = true;
do {
String s = input.readLine(); //获取键盘输入
printStream.println(s); //打印流打印键盘输入
String back = bufferedReader.readLine(); //获取服务端的返回结果 获取服务端的返回结果就是获取服务端输入给客户端的消息,所以用输入流
if("bye".equals(back)){
flag = false;
}
System.out.println(back);
} while (flag);
printStream.close();
bufferedReader.close();
}
}
服务端:
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = new ServerSocket(2000);
System.out.println("服务器已准备就绪");
System.out.println("服务器,IP:" + serverSocket.getLocalSocketAddress() + ",port:" + serverSocket.getLocalPort());
//等待客户端连接
for(;;){
Socket client = serverSocket.accept(); //等待客户端连接
ClientHandler clientHandler = new ClientHandler(client);
clientHandler.start();
}
}
private static class ClientHandler extends Thread{
private Socket socket;
private boolean flag = true;
ClientHandler(Socket s){
this.socket = s;
}
@Override
public void run(){
System.out.println("新客户端连接,IP:" + socket.getInetAddress() + ",port:" + socket.getPort());
try {
//获取服务端打印流,用来给客户端返回消息
PrintStream printStream = new PrintStream(socket.getOutputStream());
//获取服务端的输入流
BufferedReader socketInput = new BufferedReader(new InputStreamReader(socket.getInputStream()));
do{
String input = socketInput.readLine(); //获取客户端发送给服务端的消息
if("bye".equals(input)){
flag = false;
printStream.println("bye"); //回复客户端 也就是给客户端的输入流输入消息
}else{
System.out.println(input);
printStream.println("您输入的消息长度是:" + input.length()); //回复客户端 也就是给客户端的输入流输入消息
}
}while (flag);
socketInput.close();
printStream.close();
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
System.out.println("客户端已退出,IP:" + socket.getInetAddress() + ",port:" + socket.getPort());
}
}
}
先运行服务端,再运行客户端,然后在客户端发送消息给服务端,就可以看到效果了