Java之Socket编程实现一对一通信
来源:互联网 发布:漫画集软件 编辑:程序博客网 时间:2024/05/22 02:21
要实现通信,要通过一个网络线路连接两台计算机。提供信息的计算机或者程序被称为服务器,请求的信息计算机或者程序被称为客户机。
一对一的通讯实现过程:首先,服务器程序创建一个服务器套接字(ServerSocket),调用accept()方法来等待客户机的请求。然后客户端程序创建一个Socket请求与服务器连接,服务器接收客户机的连接请求,同时要创建一个新的Socket与客户建立连接。
服务端代码:
import java.awt.Container;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.awt.event.KeyEvent;import java.awt.event.KeyListener;import java.io.DataInputStream;import java.io.DataOutputStream;import java.io.IOException;import java.net.ServerSocket;import java.net.Socket;import javax.swing.JButton;import javax.swing.JFrame;import javax.swing.JPanel;import javax.swing.JTextArea;import javax.swing.JTextField;public class ChatServer {static ServerSocket ss;static Socket sc;static DataInputStream din;static DataOutputStream dout;JButton button;public ChatServer() {JFrame frame=new JFrame("服务器"); //窗口名称JPanel panel1=new JPanel();final JTextArea textArea1=new JTextArea(); //消息显示区域final JTextField textArea2=new JTextField(); //聊天内容输入区域button=new JButton("发送");Container c=frame.getContentPane();frame.setLayout(null);frame.setSize(400, 250);frame.setVisible(true);c.add(panel1);panel1.add(textArea1);panel1.add(textArea2);panel1.add(button);panel1.setLayout(null);panel1.setBounds(1, 0, 400, 250);textArea1.setLayout(null);textArea1.setBounds(0, 0, 400, 180);textArea2.setLayout(null);textArea2.setBounds(0, 185, 300, 20);button.setLayout(null);button.setBounds(300, 185, 80, 20); //界面布局textArea2.addKeyListener(new KeyListener() {@Overridepublic void keyTyped(KeyEvent e) {// TODO Auto-generated method stub}@Overridepublic void keyReleased(KeyEvent e) {// TODO Auto-generated method stub}@Overridepublic void keyPressed(KeyEvent e) { // TODO Auto-generated method stubif(e.getKeyCode()==KeyEvent.VK_ENTER){ //按Enter进行发送消息try {dout.writeUTF(textArea2.getText()); //向客户端发送所输入的信息textArea1.append("我:"+textArea2.getText()+"\r\n"); //在消息显示区域显示所发送的消息textArea2.setText(""); //清空} catch (IOException e1) {// TODO Auto-generated catch blocke1.printStackTrace();}}}});button.addActionListener(new ActionListener() { //按钮触发事件@Overridepublic void actionPerformed(ActionEvent e) {// TODO Auto-generated method stubtry {dout.writeUTF(textArea2.getText());textArea1.append("我:"+textArea2.getText()+"\r\n");textArea2.setText("");} catch (IOException e1) {// TODO Auto-generated catch blocke1.printStackTrace();}}});try {ss = new ServerSocket(9999); // 实例化ServerSocket对象sc=ss.accept(); //等待客户端响应连接din=new DataInputStream(sc.getInputStream());dout = new DataOutputStream(sc.getOutputStream());while(true){textArea1.append("客户端:"+din.readUTF()+"\r\n"); //显示客户端所发送的信息textArea2.setText(""); }} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}public static void main(String args[]) {new ChatServer();}}客户端代码:
import java.awt.Container;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.awt.event.KeyEvent;import java.awt.event.KeyListener;import java.io.DataInputStream;import java.io.DataOutputStream;import java.io.IOException;import java.net.ServerSocket;import java.net.Socket;import javax.swing.JButton;import javax.swing.JFrame;import javax.swing.JPanel;import javax.swing.JTextArea;import javax.swing.JTextField;public class ChatClient {static Socket sc;static DataInputStream din;static DataOutputStream dout;public static void main(String args[]) {JFrame frame=new JFrame("客户端"); //窗口名字JPanel panel1=new JPanel();final JTextArea textArea1=new JTextArea(); // 消息显示区域final JTextField textArea2=new JTextField(); //输入聊天内容区域JButton button=new JButton("发送");Container c=frame.getContentPane();frame.setLayout(null);frame.setSize(400, 250);frame.setVisible(true);c.add(panel1);panel1.add(textArea1);panel1.add(textArea2);panel1.add(button);panel1.setLayout(null);panel1.setBounds(1, 0, 400, 250);textArea1.setLayout(null);textArea1.setBounds(0, 0, 400, 180);textArea2.setLayout(null);textArea2.setBounds(0, 185, 300, 20);button.setLayout(null);button.setBounds(300, 185, 80, 20); //以上是界面布局textArea2.addKeyListener(new KeyListener() { //键盘事件@Overridepublic void keyTyped(KeyEvent arg0) {// TODO Auto-generated method stub}@Overridepublic void keyReleased(KeyEvent arg0) {// TODO Auto-generated method stub}@Overridepublic void keyPressed(KeyEvent e) {// TODO Auto-generated method stubif(e.getKeyCode()==KeyEvent.VK_ENTER){ //按Enter键触发try {dout.writeUTF(textArea2.getText()); //将写入的内容传送过去textArea1.append("我:"+textArea2.getText()+"\r\n"); //在自己的文本域里显示信息内容textArea2.setText(""); //清空写内容的区域} catch (IOException e1) {// TODO Auto-generated catch blocke1.printStackTrace();}}}});button.addActionListener(new ActionListener() { //按钮事件@Overridepublic void actionPerformed(ActionEvent e) {// TODO Auto-generated method stubtry {dout.writeUTF(textArea2.getText());textArea1.append("我:"+textArea2.getText()+"\r\n");textArea2.setText("");} catch (IOException e1) {// TODO Auto-generated catch blocke1.printStackTrace();}}});try {sc=new Socket("127.0.0.1",9999); //在客户端创建Socket对象din=new DataInputStream(sc.getInputStream()); //接收消息dout = new DataOutputStream(sc.getOutputStream()); //发送消息while(true){textArea1.append("服务端:"+din.readUTF()+"\r\n"); //在消息显示区域追加服务器传送过来的消息textArea2.setText(""); //清空该区域}} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}
运行时要先开服务端,再开客户端,否则会报错。
在学习Socket的时候要先看流的概念,要理解InputStream类和OutputStream类,明白网络通信是如何进行交互信息的,我在流这一块卡了很久,想了很久才明白。
实现的功能是服务端和客户端之间的信息交流,利用发送按钮触发事件传送信息和按Enter传送信息。
具体实现的界面如下:
这只是一个简单的通讯程序,有很多没有考虑周到的地方,大家有想法可以往里面加东西。
0 0
- Java之Socket编程实现一对一通信
- java网络编程之一对一的socket C/S通信
- Java用socket实现简单的一对一通信
- Java Socket编程之简单的C/S一对一的实现
- linux 下socket编程 一对一阻塞通信
- socket.io一对一通信的实现
- Java通信编程之Socket入门
- Java网络编程之Socket通信
- Java通信之Socket网络编程
- Java网络通信之Socket编程
- 网络编程之Socket通信(Java)
- 关于Socket一对一通信
- socket一对一通信学习
- Socket编程,实现通信
- Socket编程实现通信
- 六、Socket编程(服务器与客户端一对一通信)
- java socket 通信编程
- java socket通信编程
- Atitit.遍历图像像素点rgb java attilax总结
- cocos2dx -- 学习笔记 利用UIButton制作虚拟按键
- 编译并链接pthreads-win32静态库
- 例题3-17(筛选法求素数)
- Java:单例模式的七种写法
- Java之Socket编程实现一对一通信
- LeetCode 11 Container With Most Water (C,C++,Java,Python)
- 归档解档(文件写入与读取)
- JSONP 安全攻防技术
- dot net程序逆向工程基本方法
- Java不用IDE工具时如何编译的
- js获取页面窗口大小
- open-vm-tools-dkms : 依赖: open-vm-tools (>= 2:9.4.0-1280544-5ubuntu3) 但是它将不会被安装
- 浅谈栈&&进制转换