通信基础

编写服务器三步骤
第一步:实例化一个服务器:SocketServer server=new SocketServer("端口");

第二步:等待服务器的连接client=server.recept();

第三步:实例化输入输出流 outputstream ous=client.getOutputstream();inputstream ous=client.getInputstream();

第四部:开始进入读取程序

五点注意之处

1----要知道 接入一个客户机之后要循环等待 所以要有
while(true)
{---client=server.recept()----}
2----服务器需要同时处理多个客户机 这样必须要用线程来控制
3----读取消息和发送消息时 都应该和客户机定义好规则 以免出错
4----当通信结束时 要及时关闭客户机
5----突然关闭客户机可能陷入死循环要加一行当读入的数据为null时的处理语句;


编写客户机的步骤

第一步:实例化一个客户机Socket socket=new Socket();

第二步:实例化输入输出流 outputstream ous=client.getOutputstream();inputstream ous=client.getInputstream();

第三部:开始进入处理程序

注意之处
1---读取消息和发送消息时 应该定义和服务器一样的规则 以免出错
2---突然关闭客户机可能陷入死循环要加一行当读入的数据为null时的处理语句;
3---及时将收到的消息显示在界面上

---------------示范服务器部分代码------
-----创建服务器 接入客户机  启动线程-----


public class ServerTest {
public static void main(String args[]){
//int port =9090;
ServerTest sever =new ServerTest();
sever.deal(9090);
}
private void deal(int port) {
try {
//第一步  建立服务器
java.net.ServerSocket Server=new java.net.ServerSocket(port);
System.out.println("已创建一个服务器"+port);

while(true){
//第二步  等待客户器的接入  接入之后产生一个Socket对象
java.net.Socket client=Server.accept();
System.out.println("接入连接"+client.getRemoteSocketAddress());

//第三部 启动线程 处理连接对象
SeverThread st=new SeverThread(client);
st.start();
System.out.println("已启动一个线程去处理这个连接对象了");
}
} catch (IOException e) {
e.printStackTrace();
}

}
}


--------------线程处理--------
这里利用/r/n来表示一句话的结束  用bye表示通信的结束
而在实际的通信过程中 这样的协议却是不可行的 必须要严谨的协议
//自定一个SeverThread类基础自Thread处理客户机对象
public class SeverThread extends Thread {
	// 属性
	private Socket client;
	java.io.OutputStream ous;

	// 构造函数
	public SeverThread(java.net.Socket client) {
		this.client = client;
	}

	// 重写run方法
	public void run() {
		// 调用处理方法
		processchat(client);
		// 处理方法执行完毕后,线程自己退出
	}

	private void processchat(Socket client) {
		try {
			// 得到一个输出/输入流对象
			ous = client.getOutputStream();
			java.io.InputStream ins = client.getInputStream();

			String s = "欢迎进入服务器!\r\n";
			sendMsg(s);// 发送消息给客户机对象
			String inputS = readString(ins);// 读取客户机发来的消息

			while (!inputS.equals("bye")) {
				s = "我收到你的话啦" + inputS + "\r\n";
				sendMsg(s);// 发送消息给客户机对象
				inputS = readString(ins);// 读取客户机发来的消息
			}

			s = "你好,再见" + "\r\n";
			sendMsg(s);// 发送消息给客户机对象
			client.close();// 中断连接

		} catch (Exception e) {
			e.printStackTrace();
		}

	}

	private void sendMsg(String s) throws Exception {
		ous.write(s.getBytes());// 将字符串转为字节读入
		ous.flush();// 强制输出
	}

	private String readString(InputStream ins) throws Exception {
		StringBuffer stb = new StringBuffer();// 创建一个字符串缓冲区
		int i = ins.read();
		char c = (char) i;
		while (c!='#'){
			System.out.println("写入了字符"+c);
			stb.append(c);
			  i = ins.read();
			c = (char) i;
		}
		// 将读到的字节组转化为字符串返回
		String inputS = stb.toString().trim();
		System.out.println("写入了字符串"+inputS);
		return inputS;
	}

}
---------这里的客户机部分由cmd代替-----
  

你可能感兴趣的:(server,通信阶段)