第一步:创建一个简单的服务器,能将客户机发来的字符串显示出来,并且再回送给客户机
Java中编写网络通信程序,就必须用到java.net包下面的API;创建一个服务器,那是相当的 简单。 第一步:在指定端口上创建一个java.net.ServerSocket对象

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

第二步:当服务器创建成功后,就像的的手机开机后,进入待机状态一样,你也要让服务器进入 等待状态,当然是等待其它的客户机来连结它:

Socket client = server.accept();

第三步:通过client对象得到输入/输出流

OutputStream  out=client.getOutputStream();//得到一个输出/输入流对象
InputStream ins =client.getInputStream();

第四步:根据输入流对象读取数据,向输出流对象写入数据,读到的,即是客户机发来的,写出的即是发给客户机的。

java多线程网络聊天室代码 java 网络聊天室_输入流


如何使用命令提示符连结创建的服务器:

物理上,一台计算机,可以逻辑中的分成客户机和服务器两部分: 现在你手前的计算机就是一台服务器,当你进入命令行,执行telnet命令后,它同时又是一台客 户机;这样,本地的ip地址可以用”localhost”这个词代码,当然不包括双引号:

java多线程网络聊天室代码 java 网络聊天室_输入流_02

问题:
1.服务器连结一个用户退出后不能连结下一个用户。
解决方法:让服务器循环等待。

while (true) {// 让服务器处循环等待状态
			Socket client = server.accept();
			......
		}

2.服务器不能同时连结多个用户。

解决方法:多线程服务器

java多线程网络聊天室代码 java 网络聊天室_字符串_03


当一个用户连结进来,就生成一个线程对象处理client对象。

代码部分
两个类,一个创建服务器类,一个服务器的线程类
创建服务器类

/**
 * 服务器端处理与客户机连结对象的线程类对象的线程类封装
 */
public class TestServer extends Thread {
	
	
	/**
	 * 在制定端口上启动一个服务器
	 * 
	 * @throws IOException
	 * @throws 服务器所以的端口
	 */
	public void setUpServer(int port) throws Exception {
		// 1.建立绑定在制定端口上的服务器对象
		ServerSocket server = new ServerSocket(port);
		System.out.println("创建服务器成功" + port);
		// 等待客户机连结进入,进入后,生成一个Socket对象
		while (true) {// 让服务器处循环等待状态
			Socket client = server.accept();
			ServerThread st = new ServerThread(client);
			st.start();
			System.out.println("我已经启动了一个线程去处理这个对象了");
		}
	}

	
	public static void main(String[] args) throws Exception {
		TestServer ts = new TestServer();
		ts.setUpServer(9090);

	}

}

服务器线程类

public class ServerThread extends Thread{
	private Socket client;//线程对象要处理的连结变量
	private OutputStream out;//输出流对象
	/**创建这个线程类对象时,传入一个它要处理的对象*/
	public ServerThread(Socket sc){
		this.client=sc;
	}
	//将发送消息的代码包装到一个方法中
	public void sendMsg2Me(String msg) throws Exception{
		byte[] data = msg.getBytes();
		out.write(data); //用输出对象发送! 
		out.flush();//强制输出
	}
	public void run(){
		//在线程run中调用处理连结的方法
		try {
			processChat(this.client);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}
	/**
	 * 处理连接对象;读取客户机发来的字符串,回送给客户机
	 * 
	 * @param client:与客户机连结的对象
	 * @throws IOException
	 */
	//处理客户机的连结对象
	private void processChat(Socket client) throws Exception{
		out=client.getOutputStream();//得到一个输出/输入流对象
		InputStream ins =client.getInputStream();
		String s ="你好,欢迎来到服务器!\r\n";
		this.sendMsg2Me(s);
		String inputS=readString(ins);
		while(!inputS.equals("bye")){
			s="我收到了你的话啦"+inputS+"\r\n";
			this.sendMsg2Me(s);//将这个字符串发送给客户机对象
			inputS=readString(ins);//再次读取
		}
		s="你好,欢迎再来!\r\n";
		this.sendMsg2Me(s);
		client.close();
		
	}
	
	/**
	 * 从输入流对象中读取字节,拼成一个字符串反加
	 * 如果读到一个字节值为13,则认为以前的是一个字符串
	 * @param ins:输入流对象
	 * @return:从流上(客户机发来的)读到的字符串
	 * @throws Exception 
	 */
	
	private String readString(InputStream ins) throws Exception{
		StringBuffer stb = new StringBuffer();//创建一个字符缓冲区
		char c=0;
		while(c!=13){
			//遇到一个换行,就是一句话
			int i = ins.read();//读取客户机发来的一个字节
			c=(char)i;//将输入的字节转换成一个Char
			stb.append(c);
		}
		//将读到的字节组转为字符串
		String inputS=stb.toString().trim();
		return inputS;
		
	}
}