学习来源《Java与分布式系统》(机械工业出版社)
因为这学期开了分布式的课,而且中心对分布式的要求也比较大,所以最近接了一本分布式方面的书在努力学习。这些,就算是读书笔记吧。
套接字为需要相互通信的两个端口提供了通信通路。它一般有IP地址跟端口号来标识。Java.net包中提供的Socket类从操作系统的套接字服务中完整的抽象了出来,它通过一个简单的构造函数即可建立Socket实例。需要指定的参数为IP和端口号。本文将根据书中的一个聊天系统的实例学习套接字和流技术。
客户端的聊天客户类:
gui = new ChatFrame("chat with socket");
gui.input.addKeyListener(new EnterListener(this,gui));
gui.addWindowListener(new ExitListener(this));
首先创建一个socket类,用于实现与服务器的连接。然后建立读入流与读出流对象dis、dos,dis负责接受服务器传送过来的数据,在客户端刚被创建时,dos通过writeUTF(name)函数告诉服务器自己的名字.在连接建立后,dos.writeUTF(message)将直接与ChatHandler对象打交道.当关闭图形用户界面时,
将调用socket.close()函数.关闭相应的socket.
聊天服务器ChatServer:
ServerSocket ss = new ServerSocket(port);
while(true){
Socket client = ss.accept();
DataInputStream dis = new DataInputStream(client.getInputStream());
String name = dis.readUTF();
System.out.println("New client: "+name);
ChatHandler ch = new ChatHandler(name,client);
ch.start();}
服务器建立标准的套接字,并通过accept()方法监听端口,当有客户端寻址到ss对象后,变可建立连接.同时服务器端也建立个一个socket对象,并把其传送给流对象用于发送和接受数据.
信息处理器ChatHandler:
public class ChatHandler extends Thread {
.......
public static Vector handlers = new Vector();
public ChatHandler(String name, Socket socket) throws IOException {this.socket = socket;this.name = name;
dis = new DataInputStream(new BufferedInputStream(socket.getInputStream()));
dos = new DataOutputStream(new BufferedOutputStream(socket.getOutputStream()));}
public void run(){
try{
broadcast(name + "entered");
handlers.addElement(this);
while(true){String message = dis.readUTF();
broadcast(name + ": " +message);}
}catch(IOException e){
System.out.println("--Connection to user lost");
}finally{ handlers.removeElement(this); broadcast(name + " left");
try{
socket.close();
}catch(IOException e){
System.out.println("--Socket to user already closed?"); }
}
}
public static void broadcast(String message){
synchronized (handlers){
Enumeration e = handlers.elements();
while(e.hasMoreElements()){
ChatHandler ch = (ChatHandler)e.nextElement();
try{
ch.dos.writeUTF(message);
ch.dos.flush();
}catch(IOException e2){
ch.stop(); }}}}}