一个服务器端多个客户端交互
字节流交互
客户端
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.util.Scanner;
public class UserClient {
public static void main(String[] args) throws Exception {
Socket socket = new Socket("127.0.0.1", 9999);
InputStream inputStream = socket.getInputStream();
OutputStream outputStream = socket.getOutputStream();
Scanner scanner = new Scanner(System.in);
String str = "";
String toServer = "";
while (true) {
str = scanner.nextLine();
if ("exit".equals(str)) {
System.out.println("确定退出吗?Y 退出 N 不退出");
if ("Y".equals(scanner.nextLine())) {
outputStream.write("bye".getBytes());
break;
}
} else {
while (!"end".equals(str)) {
// 给服务器发送
toServer = toServer + str;
str = scanner.nextLine();
}
outputStream.write(toServer.getBytes());
toServer = "";
// 接收响应
byte[] bs = new byte[1024];
inputStream.read(bs);
System.out.println("收到服务器" + new String(bs));
}
}
try {
scanner.close();
inputStream.close();
outputStream.close();
socket.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
服务器端
import java.net.ServerSocket;
import java.net.Socket;
public class UserServer {
public static void main(String[] args) throws Exception {
ServerSocket serverSocket = new ServerSocket(9999);
while (true) {
Socket client = serverSocket.accept();
System.out.println("用户已连接......");
Thread thread = new Thread(new MyThread(client));
thread.start();
}
}
}
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.util.Scanner;
public class MyThread implements Runnable {
private Socket client;
public MyThread(Socket client) {
this.client = client;
}
@Override
public void run() {
InputStream inputStream;
try {
inputStream = client.getInputStream();
OutputStream outputStream = client.getOutputStream();
Scanner scanner = new Scanner(System.in);
String toClient = "";
while (true) {
// 接收客户端
byte[] bytes = new byte[1024];
inputStream.read(bytes);
String fromClient = new String(bytes);
System.out.println("收到客户端" + fromClient);
if ("bye".equals(fromClient)) {
break;
}
// 响应客户端
String string = scanner.nextLine();
if ("exit".equals(string)) {
break;
} else {
while (!"end".equals(string)) {
toClient = toClient + string;
string = scanner.nextLine();
}
outputStream.write(toClient.getBytes());
toClient = "";
}
}
inputStream.close();
outputStream.close();
client.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
字符流交互
客户端
package bufferedDemo;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.Scanner;
public class UserClient {
public static void main(String[] args) throws Exception {
Socket socket = new Socket("127.0.0.1", 9999);
// 得到一个输出流,用于向服务器发送数据
OutputStream outputStream = socket.getOutputStream();
OutputStreamWriter outputStreamWriter = new OutputStreamWriter(outputStream, "UTF-8");
PrintWriter writer = new PrintWriter(outputStreamWriter);// 将写入的字符编码成字节后写入一个字节流
System.out.println("请输入数据:");
Scanner sc = new Scanner(System.in);
String data = sc.nextLine();
writer.println(data);
writer.flush();// 刷新缓冲
socket.shutdownOutput();// 只关闭输出流而不关闭连接
// 获取服务器端的响应数据
InputStream inputStream = socket.getInputStream();// 得到一个输入流,用于接收服务器响应的数据
InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "UTF-8");// 将一个字节流中的字节解码成字符
BufferedReader bufferedReader = new BufferedReader(inputStreamReader);// 为输入流添加缓冲
String info = null;
// 输出服务器端响应数据
while ((info = bufferedReader.readLine()) != null) {
System.out.println("客户端接收:" + info);
}
// 关闭资源
bufferedReader.close();
inputStreamReader.close();
inputStream.close();
writer.close();
outputStreamWriter.close();
outputStream.close();
socket.close();
}
}
服务器端
package bufferedDemo;
import java.net.ServerSocket;
import java.net.Socket;
public class UserServer {
public static void main(String[] args) throws Exception {
ServerSocket serverSocket = new ServerSocket(9999);
while (true) {
Socket client = serverSocket.accept();
System.out.println("用户已连接......");
Thread thread = new Thread(new MyThread(client));
thread.start();
}
}
}
package bufferedDemo;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;
public class MyThread implements Runnable {
private Socket socket;
public MyThread(Socket client) {
this.socket = client;
}
@Override
public void run() {
InputStream inputStream = null;// 字节输入流
InputStreamReader inputStreamReader = null;// 将一个字节流中的字节解码成字符
BufferedReader bufferedReader = null;// 为输入流添加缓冲
OutputStream outputStream = null;// 字节输出流
PrintWriter writer = null;// 将写入的字符编码成字节后写入一个字节流
try {
inputStream = socket.getInputStream();
inputStreamReader = new InputStreamReader(inputStream, "UTF-8");
bufferedReader = new BufferedReader(inputStreamReader);
String info = null;// 临时
// 循环读取客户端信息
while ((info = bufferedReader.readLine()) != null) {
// 获取客户端的ip地址及发送数据
System.out.println("服务器端接收:" + "{'from_client':'" + socket.getInetAddress().getHostAddress()
+ "','data':'" + info + "'}");
}
socket.shutdownInput();// 关闭输入流
// 响应客户端请求
outputStream = socket.getOutputStream();
writer = new PrintWriter(new OutputStreamWriter(outputStream, "UTF-8"));
writer.println("{'data':'我是服务器数据'}");
writer.flush();//清空缓冲区数据
} catch (IOException e) {
e.printStackTrace();
} finally {
// 关闭资源
try {
if (writer != null) {
writer.close();
}
if (outputStream != null) {
outputStream.close();
}
if (bufferedReader != null) {
bufferedReader.close();
}
if (inputStreamReader != null) {
inputStreamReader.close();
}
if (inputStream != null) {
inputStream.close();
}
if (socket != null) {
socket.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}