[size=xx-large]简单通信服务器[/size]
在做通信的项目之前我们先了解服务器,我的理解是服务器类似于中转站,接受一个/多个客户端 的消息再转发给其他客户端,更形象的来说他像一个管道,连接着客户端! 因此,在实现通信前我们必须将管道接通,否则无法通信!
如此我们便建立了客户端与服务器的连接,如果还没有创建客户端所以可先使用系统自
带的客户端(打开cmd输入telnet 本机的ip 端口号 ——————————即可);
接下来,在连通的基础上我们要实现互相发送消息的功能,这就要涉及到发送和接受消
息,两个方面了!这里为了规范我将发送和接受各自写一个方法。
小结一下:建立连接
发送接收
发送时:只需取得连接的Socket对象的输出流,将要发送的消息转换为byte数组即可
接受时:应取得连接的Socket对象的输入流,将其转换为字符输入流在进行包装,这样做是为了可读取中文并达到最高效率。
(还有一种方法可在读取时正确读取中文而不出现乱码)
当然我们并不满足于此,我们还可以实现多个客户端同时发消息、将服务器可视化、设置用户列表、实现用户凭借用户名登陆、显示在线用户等。呵呵 ,这个下次再说!先消化这个就好!
在做通信的项目之前我们先了解服务器,我的理解是服务器类似于中转站,接受一个/多个客户端 的消息再转发给其他客户端,更形象的来说他像一个管道,连接着客户端! 因此,在实现通信前我们必须将管道接通,否则无法通信!
//创建绑定到特定端口的服务器套接字,duankou为端口号
ServerSocket ss =new ServerSocket(duankou);
// 侦听并接受到此套接字的连接
Socket client = ss.accept();
如此我们便建立了客户端与服务器的连接,如果还没有创建客户端所以可先使用系统自
带的客户端(打开cmd输入telnet 本机的ip 端口号 ——————————即可);
接下来,在连通的基础上我们要实现互相发送消息的功能,这就要涉及到发送和接受消
息,两个方面了!这里为了规范我将发送和接受各自写一个方法。
/**
*发送消息
*/
public void send(){
try {
//取得Socket对象的输出流
OutputStream os=client.getOutputStream();
//在窗体的显示文本框中显示输出的内容并转行
//(用于服务器可视化,初学可不用)
message=db.text2.getText()+"\r\n";
//将字符串转换成byte使用输出流输出
byte[] b=message.getBytes();
os.write(b);
} catch (IOException e) {
e.printStackTrace();
}
}
/**
*接收消息(先实现最简单的)
*@param client:
*/
public void receive(Socket client){
try {
InputStream is=client.getInputStream();
//InputStreamReader 是字节流通向字符流的桥梁
InputStreamReader inr=new InputStreamReader(is);
//为了达到最高效率,可要考虑在 BufferedReader 内包装 InputStreamReader
//从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取。
BufferedReader bin=new BufferedReader(inr);
String st = bin.readLine();//正行读取
//循环的读取内容
while(true){
ClientList.CastMessage(this.user, st);
//将cmd上的内容打印到窗体上
db.text1.append(this.user.getUserName()+" : "+st+"\r\n");
//读取一个文本行
st = bin.readLine();
}
} catch (IOException e) {
e.printStackTrace();
}
}
现在呢就能实现一个特别简单的服务器
小结一下:建立连接
发送接收
发送时:只需取得连接的Socket对象的输出流,将要发送的消息转换为byte数组即可
接受时:应取得连接的Socket对象的输入流,将其转换为字符输入流在进行包装,这样做是为了可读取中文并达到最高效率。
(还有一种方法可在读取时正确读取中文而不出现乱码)
InputStream is=client.getInputStream();
int length=is.available();
byte[] bytes=new byte[length];
is.read(bytes);
String st=new String(nytes,"GB2312");
当然我们并不满足于此,我们还可以实现多个客户端同时发消息、将服务器可视化、设置用户列表、实现用户凭借用户名登陆、显示在线用户等。呵呵 ,这个下次再说!先消化这个就好!