当你用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-->