socket实现服务端客户端通讯
来源:互联网 发布:虚拟人声软件 编辑:程序博客网 时间:2024/05/06 17:51
server服务端
主线程
- 构建页面
- 创建serverSocket
- 添加send按钮的点击事件
子线程
- 死循环接收消息
/** * 主线程发送消息 * 子线程接收消息 */package com.yatai.web;import java.awt.BorderLayout;import java.awt.Container;import java.awt.FlowLayout;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.io.DataInputStream;import java.io.DataOutputStream;import java.io.IOException;import java.net.ServerSocket;import java.net.Socket;import java.util.ArrayList;import javax.swing.JButton;import javax.swing.JFrame;import javax.swing.JPanel;import javax.swing.JScrollPane;import javax.swing.JTextArea;import javax.swing.JTextField;/** * @author 王伟业 2014年5月28日 */public class ChatServer implements ActionListener, Runnable { // 用来存放客户端连接数量 public static ArrayList<Socket> socketList = new ArrayList<Socket>(); // 显示历史聊天记录 private JTextArea showArea; // 待发送的字符区域 private JTextField msgText; // 窗口 private JFrame mainJframe; // 发送按钮 private JButton sentBtn; // 滚动面板 private JScrollPane JSPane; // 普通面板 private JPanel pane; // 最大的容器 private Container con; // 线程处理信息 private Thread thread = null; private ServerSocket serverSocket; private Socket connectToClient; private DataInputStream inFromClient; private DataOutputStream outToClient; /** * 构造函数用来设置界面,处理事件 */ public ChatServer() { // TODO Auto-generated constructor stub // 设置页面 mainJframe = new JFrame("服务器端"); // 初始化容器 con = mainJframe.getContentPane(); showArea = new JTextArea(); showArea.setEditable(false); // 历史聊天窗口中的文字域不能编辑,只供查看 showArea.setLineWrap(true); // 自动换行 JSPane = new JScrollPane(showArea); // 待发送文字区域 msgText = new JTextField(); msgText.setColumns(35); // 事件监听 msgText.addActionListener(this); sentBtn = new JButton("Send"); sentBtn.addActionListener(this); // 界面下部 pane = new JPanel(); pane.setLayout(new FlowLayout()); pane.add(msgText); pane.add(sentBtn); con.add(JSPane, BorderLayout.CENTER); con.add(pane, BorderLayout.SOUTH); mainJframe.setSize(500, 400); mainJframe.setLocation(600, 200); mainJframe.setVisible(true); mainJframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); try { serverSocket = new ServerSocket(8888); showArea.append(" 正在等待对话请求\n"); // 监听端口 connectToClient = serverSocket.accept(); inFromClient = new DataInputStream(connectToClient.getInputStream()); outToClient = new DataOutputStream(connectToClient.getOutputStream()); // 启动线程 thread = new Thread(this); thread.setPriority(Thread.MIN_PRIORITY); thread.start(); } catch (IOException e) { // TODO Auto-generated catch block // 出现此异常说明服务器未创建成功 showArea.append(" 对不起,不能创建服务器\n"); // 待发送文字区域不能编辑 msgText.setEditable(false); // 发送按钮不可用 sentBtn.setEnabled(false); } } /* * (non-Javadoc) * * @see java.lang.Runnable#run() */ @Override public void run() { // TODO Auto-generated method stub // 此线程用来接收客户端传来的信息 while (true) { try { showArea.append(" 对方说:" + inFromClient.readUTF() + "\n"); Thread.sleep(1000); } catch (IOException | InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } /* * (non-Javadoc) * * @see * java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent) */ @Override public void actionPerformed(ActionEvent e) { // TODO Auto-generated method stub // 响应按钮事件 String s = msgText.getText(); // 如果待发送文字区域存在文字 if (s.length() > 0) { try { // 将文字写入到流中 outToClient.writeUTF(s); outToClient.flush(); // 历史聊天记录增添内容 showArea.append(" 我说:" + msgText.getText() + "\n"); // 待发送文字区域设为空 msgText.setText(null); } catch (IOException e1) { // TODO Auto-generated catch block // 出现此异常说明消息未发送成功 showArea.append(" 你的消息:" + "“" + msgText.getText() + "”" + "未能发送成功\n"); } } } public static void main(String[] args) { // 主线程用来发送消息 new ChatServer(); }}
client客户端
主线程
- 构建页面
- 连接serverSocket
- 添加send按钮的监听事件
子线程
- 死循环接收消息
/** * */package com.yatai.web;import java.awt.BorderLayout;import java.awt.Container;import java.awt.FlowLayout;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.io.DataInputStream;import java.io.DataOutputStream;import java.io.IOException;import java.net.Socket;import javax.swing.JButton;import javax.swing.JFrame;import javax.swing.JPanel;import javax.swing.JScrollPane;import javax.swing.JTextArea;import javax.swing.JTextField;/** * @author 王伟业 2014年5月28日 */public class ChatClient implements ActionListener, Runnable { // 相同的界面形式 private JTextArea showArea; private JTextField msgText; private JFrame mainJframe; private JButton sentBtn; private JScrollPane JSPane; private JPanel pane; private Container con; // 相似的处理方法 private Thread thread = null; private Socket connectToServer; private DataInputStream inFromServer; private DataOutputStream outToServer; /** * */ public ChatClient() { // TODO Auto-generated constructor stub // 构造函数下完成以下内容 mainJframe = new JFrame("客户端"); con = mainJframe.getContentPane(); showArea = new JTextArea(); showArea.setEditable(false); showArea.setLineWrap(true); showArea.setWrapStyleWord(true); JSPane = new JScrollPane(showArea); msgText = new JTextField(); msgText.setColumns(35); msgText.addActionListener(this); sentBtn = new JButton("Send"); sentBtn.addActionListener(this); pane = new JPanel(); pane.setLayout(new FlowLayout()); pane.add(msgText); pane.add(sentBtn); con.add(JSPane, BorderLayout.CENTER); con.add(pane, BorderLayout.SOUTH); mainJframe.setSize(500, 400); mainJframe.setLocation(80, 200); mainJframe.setVisible(true); mainJframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); try { connectToServer = new Socket("localhost", 8888); inFromServer = new DataInputStream(connectToServer.getInputStream()); outToServer = new DataOutputStream(connectToServer.getOutputStream()); showArea.append(" 连接成功,可以通信\n"); // 创建线程 thread = new Thread(this); thread.setPriority(Thread.MIN_PRIORITY); thread.start(); } catch (IOException e) { // TODO Auto-generated catch block // 出现异常说明连接失败 // 向历史聊天区域打印提示信息 showArea.append(" 对不起,连接服务器失败\n"); // 异常连接时输入框不可用 msgText.setEditable(false); msgText.setEnabled(false); } } /* * (non-Javadoc) * * @see java.lang.Runnable#run() */ @Override public void run() { // TODO Auto-generated method stub // 该线程用来接收传来的消息 while (true) { try { showArea.append(" 对方说:" + inFromServer.readUTF() + "\n"); Thread.sleep(1000); } catch (IOException | InterruptedException e) { // TODO Auto-generated catch block // 此处异常处理。。。。 e.printStackTrace(); } } } /* * (non-Javadoc) * * @see * java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent) */ @Override public void actionPerformed(ActionEvent e) { // TODO Auto-generated method stub // 响应事件 String s = msgText.getText(); // 如果待发送文字区域存在文字 if (s.length() > 0) { try { // 将文字写入到流中 outToServer.writeUTF(s); outToServer.flush(); // 历史聊天记录增添内容 showArea.append(" 我说:" + msgText.getText() + "\n"); // 待发送文字区域设为空 msgText.setText(null); } catch (IOException e1) { // TODO Auto-generated catch block // 出现此异常说明消息未发送成功 showArea.append(" 你的消息:" + "“" + msgText.getText() + "”" + "未能发送成功\n"); } } } public static void main(String[] args) { new ChatClient(); }}
阅读全文
0 0
- socket实现服务端客户端通讯
- socket实现服务端与客户端的通讯
- socket通讯 客户端和服务端
- Socket客户端和服务端通讯
- C++ socket编程 实现服务端与客户端的通讯
- socket实现客户端与服务端的通讯(群聊)
- socket编程 实现服务端与客户端的通讯
- C++ socket编程 实现服务端与客户端的通讯
- C++ socket编程 实现服务端与客户端的通讯
- C++ socket编程 实现服务端与客户端的通讯
- C++ socket编程 实现服务端与客户端的通讯
- Untiy中用C#实现TCP通讯(Socket通讯)服务端与客户端皆可
- Socket客户端与服务端通讯实例
- 【Android】Socket通讯示例(服务端/客户端)
- 足迹二:Android客户端与PC服务端之间的SOCKET通讯实现登陆功能(客户端 仅供学习)
- php socket客户端和服务端互相通讯实例
- JAVA使用Socket模拟服务端与客户端通讯
- node.js服务端和QT客户端简单Socket通讯
- spring 中 isolation 和 propagation 详解
- File类
- 移动端:active伪类无效的解决方法
- log4j日志配置jeromq和activemq
- Ftp 组件在Linux上运行的异常总结
- socket实现服务端客户端通讯
- xcode8.3.3模拟器编译报错Command /usr/bin/codesign failed with exit code 1
- oracle帮助文档——Advanced Application Developer's Guide
- nginx负载均衡概述
- 掌握Linux运维核心知识的快速方法
- 怎么注册不需要实名认证的.com域名?
- 流媒体与直播技术学习笔记
- Hadoop命令参考
- 云计算基础设施持续集成实践