Java实现服务器与客户端通信

基础要点

我们的需求是用Java实现服务器与客户端通信,在Java类库中有相应使用简单的类库,了解基本原理不难实现服务器和客户端通信

1、编程之前我们要对TCP/IP协议有一定的了解,知道Socket套接字的基本用法。

2、关于数据的传输方式,我们要掌握Java中IO流的使用,服务器发出的输出流的所有信息都会成为客户端的输入流,同时所有客户端的所有输出流都会包含在服务器的输入流中。

3、一般服务器绝不可能只为一个客户端服务,当存在很多客户端的时候,需要为每个客户端的链接建立独立的线程,使得客户端之间不会干扰,独立运行。

线程的控制实现方法有两种:

(1).自定义线程类继承Thread,并重现run()方法;

(2).自定义一个普通类,实现Runnable接口。

在以上要点的基础上,尝试编程

代码示例

//服务器代码模拟
package com.DrawServer;

import java.io.IOException;

public class DrawServer {

	public void setServer(int port){
		try {
			//1、使用socket套接字建立服务器
			java.net.ServerSocket ss = new java.net.ServerSocket(port);
			System.out.println("服务器建立成功~! "+port);
			
			//2、当客户机接入后,一直待机等待数据输入输出
			java.net.Socket client = ss.accept();
			System.out.println("有个客户机进来了。。。。");
			//3、建立输入输出流
			java.io.InputStream ins = client.getInputStream();
			java.io.OutputStream ous = client.getOutputStream();
			
			//尝试给客户端输出一句话
			String s = "Who are you ?";
			byte[] data = s.getBytes();
			ous.write(data);
			
			//尝试读取输入的数据
			int t = ins.read();
			while(t!='a'){
				System.out.println("读到的一个字节是 "+ t);
				t = ins.read();
			}
			//关闭服务器
			client.close();
			
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	public static void main(String[] args){
		DrawServer ds = new DrawServer();
		ds.setServer(9998);
	}
}
//客户端代码模拟
package com.Client;

import java.io.IOException;
import java.net.UnknownHostException;

public class DrawClient {

	public void conn2Server(){		
		try {
			//1、建立客户端
			java.net.Socket client = new java.net.Socket("127.0.0.1",9998);
			System.out.println("连接成功!");
			//2、建立输入输出流
			java.io.InputStream insInputStream = client.getInputStream();
			java.io.OutputStream out = client.getOutputStream();
			//读取数据并输出一句话
			while(true){
				int t = insInputStream.read();
				System.out.println("读取的是 "+ t);
				
				String msgString = "bccdef";
				byte[] data = msgString.getBytes();
				out.write(data);
				
				try {
					Thread.sleep(1000);
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
				
		} catch (UnknownHostException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	public static void main(String[] args){
		DrawClient dsClient = new DrawClient();
		dsClient.conn2Server();
	}
}

除了运行代码构建客户端以外,我们还可以cmd窗口通过端口映射连接到本地端口,也可以得到服务器收发而来的信息,如果我们将多线程运用到通信中后,我们可以进一步打开多个窗口,而且同时运行,互不干扰。