Java 套接字技术

学习来源《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();	}}}}}

  

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值