class="p0" style="margin-top: 0pt; margin-bottom: 0pt;">当你用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-->