网络编程Socket和serverSocket,客户端与服务器端编程

例子:
1.这是一个客户端与一个服务器的对接:
服务器端:

public class Server {
	// 服务器读入客户端传过来的信息
	public static void main(String[] args) throws IOException {
		ServerSocket serverSocket = new ServerSocket(8799);
		// 1.服务器端跟客户端建立连接
		System.out.println("服务器已经启动,监听端口号是:8799");
		Socket socket = serverSocket.accept();
		// 2.打开socket 的相关输入流
		InputStream in = socket.getInputStream();
		// 2.通过socket得到输出流
		OutputStream out = socket.getOutputStream();
		// 3.读取数据
		// 乱码处理
		InputStreamReader isr = new InputStreamReader(in);
		// 提高读取速度
		BufferedReader br = new BufferedReader(isr);
		String strs;
		while ((strs = br.readLine()) != null) {
			System.out.println("服务器端接收端客户端的信息是:" + strs);
		}
		socket.shutdownInput();//暂时禁用输入流
		// 乱码处理
		OutputStreamWriter osw = new OutputStreamWriter(out);
		// 提高读取速度
		BufferedWriter bw = new BufferedWriter(osw);
		// 3.写出信息到网络
		bw.write("hello,client!");
		bw.flush();// 把残留的数据全部倒出

		// 4.关闭资源
		br.close();
		isr.close();
		in.close();
		bw.close();
		osw.close();
		out.close();
		socket.close();
		serverSocket.close();
	}
}

客户端:

public class Client {
	public static void main(String[] args) throws UnknownHostException, IOException {
		// 1.建立跟服务器端连接
		Socket socket = new Socket("192.168.92.28", 8799);

		// 2.打开socket 的相关输入流
		InputStream in = socket.getInputStream();
		// 2.通过socket得到输出流
		OutputStream out = socket.getOutputStream();
		// 乱码处理
		OutputStreamWriter osw = new OutputStreamWriter(out);
		// 提高读取速度
		BufferedWriter bw = new BufferedWriter(osw);
		// 3.写出信息到网络
		bw.write("hello,Server!");
		bw.flush();// 把残留的数据全部倒出
		socket.shutdownOutput();//暂时禁用输出流

		// 3.读取数据
		// 乱码处理
		InputStreamReader isr = new InputStreamReader(in);
		// 提高读取速度
		BufferedReader br = new BufferedReader(isr);
		String strs;
		while ((strs = br.readLine()) != null) {
			System.out.println("客户端接收端服务器端的信息是:" + strs);
		}

		// 4.关闭资源
		br.close();
		isr.close();
		in.close();
		bw.close();
		osw.close();
		out.close();
		socket.close();
	}
}

2.这是多个客户端与多个服务器端的对接:使用了线程实现Runnable接口的方法
客户端:多线程实现多个客户端登录功能

//客户端
public class Client {
	public static void main(String[] args) throws UnknownHostException, IOException {
		// 1.建立跟服务器端连接
		Socket socket = new Socket("localhost", 8799);

		CSRunnable testRunnable = new CSRunnable(socket);
		Thread t = new Thread(testRunnable);
		
		t.start();
	}
}
//客户端实现Runnable接口方法
public class CSRunnable implements Runnable {
	Socket socket = null;// 表示生产了某个产品

	public CSRunnable(Socket socket) {
		this.socket = socket;
	}

	@Override
	public void run() {
		try {
			// 2.打开socket 的相关输入流
			InputStream in = socket.getInputStream();
			// 2.通过socket得到输出流
			OutputStream out = socket.getOutputStream();

			// 3.写出信息到网络
			ObjectOutputStream oos = new ObjectOutputStream(out);
			User user = new User();
			Scanner input = new Scanner(System.in);
			System.out.print("请输入用户名:");
			user.setName(input.next());
			System.out.print("请输入密码:");
			user.setPassword(input.next());
			oos.writeObject(user);// 把整个对象写出到网络
			oos.flush();// 把残留的数据全部倒出

			socket.shutdownOutput();// 暂时禁用输出流

			// 3.读取数据
			// 乱码处理
			InputStreamReader isr = new InputStreamReader(in);
			// 提高读取速度
			BufferedReader br = new BufferedReader(isr);
			String strs;
			while ((strs = br.readLine()) != null) {
				System.out.println("客户端接收端服务器端" + Thread.currentThread().getName() + "的信息是:" + strs);
			}

			// 4.关闭资源
			br.close();
			isr.close();
			in.close();
			oos.close();
			out.close();
			socket.close();
		} catch (Exception e) {
			e.printStackTrace();
		}

	}

}

服务器端:

//服务器端
public class Server {
	// 服务器读入客户端传过来的信息
	public static void main(String[] args) throws Exception {
		ServerSocket serverSocket = new ServerSocket(9999);
		System.out.println("服务器已经启动,监听端口号是:9999");
		try {
			while (true) {//来一个客户端,虚拟一个服务器
				// 1.服务器端跟客户端建立连接
				Socket socket = serverSocket.accept();
				//创建线程
				CSRunnable testRunnable = new CSRunnable(socket);
				Thread t = new Thread(testRunnable);
				t.start();
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			serverSocket.close();
		}
	}
}

//服务端实现Runnable接口方法
public class CSRunnable implements Runnable {
	Socket socket = null;//

	public CSRunnable(Socket socket) {
		this.socket = socket;
	}

	@Override
	public void run() {
		try {
			// 2.打开socket 的相关输入流
			InputStream in = socket.getInputStream();
			// 2.通过socket得到输出流
			OutputStream out = socket.getOutputStream();

			// 3.从网络读取数据
			ObjectInputStream ois = new ObjectInputStream(in);
			User user = (User) ois.readObject();
			if (user!=null) {
				System.out.println("服务器端" + Thread.currentThread().getName() + "接收端客户端的数据:用户名为:" + user.getName() + ";密码是:"
						+ user.getPassword());
			}
	
			socket.shutdownInput();// 暂时禁用输入流
			// 乱码处理
			OutputStreamWriter osw = new OutputStreamWriter(out);
			// 提高读取速度
			BufferedWriter bw = new BufferedWriter(osw);
			if (socket != null) {
				if (user.getName().equals("张三") && user.getPassword().equals("111")) {
					bw.write(user.getName() + "欢迎您,登录成功!");
					bw.flush();// 把残留的数据全部倒出
				} else if (user.getName().equals("李四") && user.getPassword().equals("111")) {
					bw.write(user.getName() + "欢迎您,登录成功!");
					bw.flush();// 把残留的数据全部倒出
				} else if (user.getName().equals("王五") && user.getPassword().equals("111")) {
					bw.write(user.getName() + "欢迎您,登录成功!");
					bw.flush();// 把残留的数据全部倒出
				} else if (user.getName().equals("小二") && user.getPassword().equals("111")) {
					bw.write(user.getName() + "欢迎您,登录成功!");
					bw.flush();// 把残留的数据全部倒出
				} else {
					bw.write("登录失败!");
					bw.flush();// 把残留的数据全部倒出
				}
			}
			// 4.关闭资源
			bw.close();
			osw.close();
			out.close();
			ois.close();
			in.close();
			socket.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

共用实体用户类:

public class User implements Serializable{
	private static final long serialVersionUID = 1L;//加上版本号
	private String name;
	private String password;
	public User() {
		super();
	}
	public User(String name, String password) {
		super();
		this.name = name;
		this.password = password;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
}

运行结果:
客户端
在这里插入图片描述服务器端
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值