socket中流的使用

一个服务器端多个客户端交互

字节流交互

客户端

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();
			}

		}
	}
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值