java socket源码,Java Socket聊天程序源代码

本程序是基于java语言的Socket聊天程序,采用TCP传输协议,实现两个人之间的信息交互。在形成最终结果之前,我经历了两个过程程序,两个过程均为半成品,他们反映了我整个课程设计中的思考过程,在一个较为系统思考过程后,socket思想一层一层加固,让我映像很深刻,收获很多。在此文档中,我将演示我两个过程程序的思考过程,然后对源代码进行讲解,但最终上传的代码为制成品。

在两个过程程序中,TestServer1和TestClient1为第一个过程,TestServer2和TestClient2为第二个过程,MySingleThreadServer1和MySingleThreadClient1为最终程序。其中,TestServer2和TestClient2实现了多线程,一个线程负责接收,另一个线程负责发送,MySingleThreadServer1和MySingleThreadClient1实现了基于GUI的聊天。控件并非像MFC那样很容易就可以通过拖动组件实现,java是通过程序的编写来实现,我采用awt组件编码实现GUI,界面很简单,但花了不少时间来布局。

核心代码讲解:

三个过程程序都牵涉了java socket编程最核心的思想,以下为核心的讲解。

1.服务器端

Java Socket服务器端需要引入两个包,java.io包和java.net包,io包是解决输入输出流的问题,而net包包含了socket编程所需的API.

服务器端首先要得到ServerSocket的对象,即ServerSocket ss = new ServerSocket(5555); 5555为服务器端的端口号。Socket s = ss.accept();服务器端Socket对象通过accept()方法开始监听链接过来的客户端信息。如果有客户端有信息过来,则对象s调用输入输出流的方法,如s.getInputStream(),同时把得到的InputStream 封装在DataInputStream当中,在客户端与服务器端通信时,有可能两端存在于不同的操作系统,封装在DataInputStream可以很好的解决这个问题。

2.客户端

其实客户端代码与服务器端大多类似,有一点显著不同,在客户端没有ServerSocket类,即客户端不用监听任何链接,他只需要发送链接即可。Socket s = new Socket(String IPAddr,int port),IPAddr为服务器端的IP地址,port为服务器端的端口号即5555,由于本程序服务器端和客户端在同一主机上,所以服务器端IP地址为127.0.0.1。通过IPAddr和port两个参数就可以得到Socket对象s,接下来的步骤就和服务器程序类似了。

对三个过程程序的详解

Procedure1:

服务器端核心代码如下:

ServerSocket ss = new ServerSocket(5555);

Socket s = ss.accept();

OutputStream os = s.getOutputStream();

DataOutputStream dos = new DataOutputStream(os);

InputStream is = s.getInputStream();

DataInputStream dis = new DataInputStream(is);

InputStreamReader isr = new InputStreamReader(System.in); //重键盘读入数据

BufferedReader br = new BufferedReader(isr); //把从键盘读入的数据放入缓冲

String info;

while(true){

info = dis.readUTF();

System.out.println("客户端说:" + info);

if(info.equals("goodbye")){

break;

}

info = br.readLine();

dos.writeUTF(info);

System.out.println("服务器说:" + info);

if(info.equals("goodbye")){

break;

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
JAVA语言实现网络聊天import java.io.*; import java.net.*; import java.util.*; public class ChatHandler implements Runnable { protected Socket socket; protected ObjectInputStream dataIn; protected ObjectOutputStream dataOut; protected Thread listener; protected static Vector handlers = new Vector(); private boolean keepListening = true; public ChatHandler(Socket socket) { this.socket = socket; } public synchronized void start() { if (listener == null) { try { dataIn = new ObjectInputStream(socket.getInputStream()); dataOut = new ObjectOutputStream(socket.getOutputStream()); listener = new Thread(this); listener.start(); } catch (IOException ioException) { ioException.printStackTrace(); } } } public synchronized void stop() { if (listener != null) { try { if (listener != Thread.currentThread()) listener.interrupt(); listener = null; dataOut.close(); socket.close(); } catch (IOException ignored) { } } } public void run() { String message = ""; try { handlers.addElement(this); while (keepListening) { message = (String) dataIn.readObject(); if (message.equals("DISCONNECT")) { dataOut.writeObject(message); dataOut.flush(); stopListening(); } else broadcast(message); } } catch (ClassNotFoundException classNotFoundException) { } catch (EOFException ignored) { } catch (IOException ex) { if (listener == Thread.currentThread()) ex.printStackTrace(); } finally { handlers.removeElement(this); } try { dataIn.close(); } catch (IOException ioException) { ioException.printStackTrace(); } stop(); } protected void broadcast(String message) { synchronized (handlers) { Enumeration enumer = handlers.elements(); while (enumer.hasMoreElements()) { ChatHandler handler = (ChatHandler) enumer.nextElement(); try { handler.dataOut.writeObject(message); handler.dataOut.flush(); } catch (IOException ex) { handler.stop(); } } } } public void stopListening() { keepListening = false; } }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值