代码的服务端和客户端都是本机,以下是服务端程序代码:
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
import java.util.concurrent.*;
public class SocketReceiver { //服务端
public static void main(String[] args) throws ExecutionException, InterruptedException {
ServerSocket serverSocket = null;
try {
serverSocket = new ServerSocket(52189);
while (true) {
Socket socket = serverSocket.accept();
ExecutorService executor= Executors.newSingleThreadExecutor();
Future<String> future=executor.submit(new ReceiveHandler(socket));
String result=future.get();
if (result.equals("客户端: quit"))
{
socket.close();
break;
}
else {
socket.close();
}
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (serverSocket != null)
try {
serverSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
class ReceiveHandler implements Callable<String> {
private Socket socket=null;
public ReceiveHandler(Socket socket) {
this.socket = socket;
}
public String call() {
String str=null;
try {
InputStream in = socket.getInputStream();
int count = 0;
while (count == 0) {
count = in.available();
}
byte[] b = new byte[count];
in.read(b);
str = new String(b);
System.out.println(str);
if (str.equals("客户端: quit"))
{
System.out.println("客户端已离线!");
}
else {
OutputStream outer = socket.getOutputStream();
Scanner input = new Scanner(System.in);
String message = input.nextLine();
message = "服务端: " + message;
byte[] b_out = message.getBytes();
outer.write(b_out);
outer.flush();
}
} catch (IOException e) {
e.printStackTrace();
}
return str;
}
}
以下是客户端代码:
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;
import java.util.Scanner;
public class SocketSender { //客户端
public static void main(String[] args) {
Socket socket = null;
try {
InetAddress ip=InetAddress.getByName("localhost");
while (true) {
socket = new Socket(ip, 52189);
OutputStream outer = socket.getOutputStream();
Scanner in = new Scanner(System.in);
String message = in.nextLine();
String messages = new String("客户端: " + message);
byte[] b = messages.getBytes();
outer.write(b);
outer.flush();
if (message.equals("quit"))
{
socket.close();
System.out.println("服务端已离线!");
break;
}
else {
InputStream inner = socket.getInputStream();
int count = 0;
while (count == 0) {
count = inner.available();
}
byte[] recv = new byte[count];
inner.read(recv);
String str_recv = new String(recv);
System.out.println(str_recv);
socket.close();
}
}
}catch (IOException e) {
e.printStackTrace();
}
}
}
运行结果如图所示:
客户端终端:
服务端终端: