利用TCP实现双向聊天
来源:互联网 发布:mysql私房菜深入浅出 编辑:程序博客网 时间:2024/05/21 08:54
读书笔记:《Java语言程序设计》–郭克华
案例介绍
这里服务器和客户端界面相同,都可以给对方发送信息,也能够自动收到对方发过来的信息。效果如下图所示。
“服务器”和“客户端”对话框都有一个文本框,输入聊天信息。输入聊天信息知乎,单击”发送”按钮发送给对方,对方也能够自动收到之后显示。
如何实现双向聊天
客户端与服务器的通信过程,包括读信息和写信息,对于客户端和服务器端,如果将数据传给对方,就称为写,用到输出流;反之,如果从对方处得到数据,就为读,用到输入流。
TCP编程中,客户端和服务器之间的通信是通过Sokcet实现的。
1.如何向对方发送信息?
从java.net.Socket文档中,会发现其中有一个重要函数:
public OutputStream getOutputStream() throws IOExecption
打开次Socket的输出流。
OutputStream功能并不强大,但是可以和java.io.PrintStream类配合使用,使之能够输出一行。代码如下:
Socket socket=new Socket("127.0.0.1",9999);OutputStream os=socket.getOutputStream();PrintStream ps=new PrintStream(os);ps.println("消息内容");
就是用Socket向对方发出一个字符串。
2.如何从对方处接受信息?
打开java.net.Socket文档,会发现其中有一个函数:
public InputStream getInputStream() throws IOException
代开Socket的输入流。
InputStream功能并不强大,但是可以和BufferReader函数配合使用,使之能够读取一行。代码如下:
Socket socket=new Socket("127.0.0.1",9999);InputStream is=socket.getInputStream();BufferReader br=new BufferReader(new InputStream(is));String str=br.readLine();System.out.println(str);
就是从Socket的输入流中读入字符串,并打印。
很明显,在本程序中,客户端和服务器端的通信,既要用到读操作,又要用到写操作。
ps:值得一提的是,在客户端与服务器端之间传递信息时,BufferReader的readLine函数是一个“死等函数”,如果客服端连接上了,但是没有发送信息,readLine函数会一直死等。
所以,客户端和服务器端如果需要自动读取对方传来的信息,就不能将readLine函数放在主线程内,因为在不知道对方在什么时候会发出信息的情况下,readLine函数的死等,可能会造成程序的阻塞。所以最好的方法是将读取信息的代码写在线程内。
代码编写
综合以上叙述,建立服务器端代码如下:
package practice;import java.awt.*;import java.awt.event.*;import java.io.*;import java.net.*;import javax.swing.*;public class Server extends JFrame implements ActionListener,Runnable { private JTextArea taMsg=new JTextArea("以下是聊天记录\n"); private JTextField tfMsg=new JTextField("请您输入信息"); private JButton btSend=new JButton("发送"); private Socket s=null; public Server() { this.setTitle("服务器端"); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.add(taMsg,BorderLayout.CENTER); tfMsg.setBackground(Color.yellow); this.add(tfMsg,BorderLayout.NORTH); this.add(btSend,BorderLayout.SOUTH); btSend.addActionListener(this); this.setSize(200,300); this.setVisible(true); try { ServerSocket ss=new ServerSocket(9999); s=ss.accept(); new Thread(this).start(); } catch (Exception ex) { } } @Override public void run(){ try { while(true) { InputStream is=s.getInputStream(); BufferedReader br=new BufferedReader(new InputStreamReader(is)); String str=br.readLine(); //读 taMsg.append(str+"\n"); //添加内容 } } catch (Exception ex) { } } @Override public void actionPerformed(ActionEvent e) { try { OutputStream os=s.getOutputStream(); PrintStream ps=new PrintStream(os); ps.println("服务器说:"+tfMsg.getText()); } catch (Exception ex) { } } public static void main(String[] args) throws Exception { new Server(); }}
运行这个程序,就可以得到服务器的效果。
接下来是客户端程序,代码如下:
package practice;import java.awt.*;import java.awt.event.*;import java.io.*;import java.net.*;import javax.swing.*;public class Client extends JFrame implements ActionListener,Runnable { private JTextArea taMsg=new JTextArea("以下是聊天记录\n"); private JTextField tfMsg=new JTextField("请您输入信息"); private JButton btSend=new JButton("发送"); private Socket s=null; public Client() { this.setTitle("客户端"); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.add(taMsg,BorderLayout.CENTER); tfMsg.setBackground(Color.yellow); this.add(tfMsg,BorderLayout.NORTH); this.add(btSend,BorderLayout.SOUTH); btSend.addActionListener(this); this.setSize(200,300); this.setVisible(true); try { s=new Socket("127.0.0.1",9999); new Thread(this).start(); } catch (Exception ex) { } } @Override public void run(){ try { while(true) { InputStream is=s.getInputStream(); BufferedReader br=new BufferedReader(new InputStreamReader(is)); String str=br.readLine();//读 taMsg.append(str+"\n"); //添加内容 } } catch (Exception ex) { } } @Override public void actionPerformed(ActionEvent e) { try { OutputStream os=s.getOutputStream(); PrintStream ps=new PrintStream(os); ps.println("客户端说:"+tfMsg.getText()); } catch (Exception ex) { } } public static void main(String[] args) throws Exception { new Client(); }}
运行,得到客户端界面,两者即可聊天。
ps:必须要先运行服务器端,在运行客户端。
- 利用TCP实现双向聊天
- 用TCP实现双向聊天系统
- 利用UDP实现双向聊天系统
- 利用TCP实现简单聊天程序
- 利用TCP实现多客户聊天系统
- Android利用Socket(TCP)通信实现即时聊天
- python利用TCP实现会聊天的小机器人
- 【TCP简单聊天实现】
- TCP聊天实现
- java TCP实现聊天
- Tcp 实现简单的聊天
- UDP实现的简易双向聊天功能
- 利用TCP和UDP协议,实现基于Socket的小聊天程序(初级版)
- 利用TCP协议,实现基于Socket的小聊天程序(初级版)
- Delphi简单TCP聊天程序(二):双向传输
- 利用webQQ实现聊天机器人。。
- 利用css实现聊天气泡
- socket 编程 TCP 实现简单聊天功能
- 51Nod 1090 3个数和为0(O(n^2)复杂度)
- 算法系列(14) Leetcode 492. Construct the Rectangle
- Ubuntu16.04关闭客人会话
- C#——常用的日期时间操作函数
- 线上问题排查:数据库中的一行不能被update
- 利用TCP实现双向聊天
- java-logger
- iOS中检测当前设备的旋转方向(关闭屏幕旋转)
- 基于Django的微信公众号开发(5) -- 实现消息的接收与发送
- mybatis原理解析---SqlSession运行过程(上)
- ShaderForge插件介绍详解
- 20171219Excel函数(Offset)使用方法记录
- 树的高度
- leetcode题解-147. Insertion Sort List