通信之——简单服务器

当你用QQ,人人,或者其他网上聊天工具和别人聊天时,你说的话,或者你发的表情怎么就能到达对方的视野内呢?你可能觉得很神奇吧!下面我来带你解开这个谜!首先就是要有一个服务器,作为两个或多个客户机之间信息传播的媒介。

建立一个指定接口的服务器:

ServerSocket ss1=new ServerSocket(port);
System.out.println("服务器创建成功!"+port);

等待客户机进入,进入之后生成一个Socket对象

 

Socket wait=ss1.accept();
System.out.println("wait.ss1:"+wait.getRemoteSocketAddress());

调用服务器对象server.accept()方法时,程序就会“阻塞”在这个调用上,或者说”卡”到这里,直到有一个客户机连结上来,这个方法才会返回,返回一个Socket类对象.但是当有多个客户机连接的时候,会发生阻塞,所以用线程去处理每一个连接对象,当有用户连入的时候,启动一个线程。

ServerThread ct=new ServerThread(client);
ct.start();

 一个简单服务器的完整代码:

package qunliaocome.cnxj0630;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

import javax.swing.JFrame;

public class Serve0630 {
	public static void main(String[]args){
		Serve0630 s=new Serve0630();
		s.Setupserver(9080);
		
	}
	public void Setupserver(int port){
		/**
		* 在指定端口上启动一个服务器
		* @param port:服务器所连的端口
		*/
		try{
			while(true){
		ServerSocket ss1=new ServerSocket(port);
		System.out.println("服务器创建成功!"+port);
		//讓服務器進入等待状态
		Socket wait=ss1.accept();
		System.out.println("wait.ss1:"+wait.getRemoteSocketAddress());
		process(wait);}
		}catch(Exception e){
		e.printStackTrace();
		}
		}
	/**
	* 处理连结对象:读取客户机发来的字符串,回送给客户机
	* @param client:与客户机的连结对象
	*/
	public  void process(java.net.Socket wait){
		try{
			//从连接对象上得到输出输入流对象
			 OutputStream ous= wait.getOutputStream();
			 InputStream ins=wait.getInputStream();
			 String ss="你好!欢迎您光临!";
			 byte[]data=ss.getBytes();
			 ous.write(data);
			 ous.flush();
			 String inputS=readString(ins);
			 while(!inputS.equals("goodbye")){
				 System.out.println("客户机说: "+inputS);
				 ss="服务器收到:"+inputS+"\r\n";
				 data=ss.getBytes();//取得组成这个字符串的字节
				 ous.write(data); //用输出对象发送!
				 ous.flush();//强制输出
				//读取客户机的下一次输入
				 inputS=readString(ins); //读取客户机的下一次输入
				 }
				 ss="你好,欢迎再来!\r\n";
				 data=ss.getBytes();
				 ous.write(data);
				 ous.flush();
				 wait.close();//半闭与客户机的连结
			
		}catch (Exception e){
			e.printStackTrace();
			
		}
		
	}
	/**
	* 从输入流对象中读取字节,拼成一个字符串返加
	* 如果读到一个字节值为13,则认为以前的是一个字符串
	* @param ins:输入流对象
	* @return :从流上(客户机发来的)读到的字符串
	*/
	private  String readString(InputStream ins) throws IOException {
		//创建一个字符串缓冲区
		StringBuffer stb=new StringBuffer();
		char c =0;
		while(c!=13){
		//遇到一个换行,就是一句话
		int i= ins.read();//读取客户机发来的一个字节
		c=(char)i;//将输入的字节转换为一个Char
		stb.append(c);
		}
		//将读到的字节组转为字符串,并调用trim去掉尾部的空格
		String inputS=stb.toString().trim();
		return inputS;
		
		}
}
	

 

 

<!--EndFragment--><!--EndFragment-->

你可能感兴趣的:(java,通信,简单服务器)