基于TCP的客户端与服务器端之间的通信
2016-11-13 13:02
351 查看
使用说明:把服务器IP地址更改为自己的服务器主机IP地址即可
import java.awt.*;
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.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.UnknownHostException;
import javax.swing.JFrame;
public class Chat extends JFrame implements Runnable, ActionListener {
}
import java.awt.*;
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.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.UnknownHostException;
import javax.swing.JFrame;
public class Chat extends JFrame implements Runnable, ActionListener {
private Panel topPanel_1, downPanel_1, midPanel_left, midPanel_right; private Label ipLabel, localNameLabel; private TextField ipTextField, localNameField; private Button createServer, searchServer, sendMessage; private TextArea text1, text2, text3, text4; private ServerSocket server; private Socket serverSocket, clientSocket; private DataOutputStream outputFromClient, outputFromServer; private DataInputStream inputToClient, inputToServer; private int scan = 2;// scan:便于区分0客户端与1服务器端的文本内容 private int lock=0;//0:创建服务器 1:停止服务器 /***************************** 获取主机IP 与 名称 ******************************/ public String getIp() { String ip = null; try { InetAddress myLocalHost = InetAddress.getLocalHost(); ip = myLocalHost.getHostAddress(); } catch (UnknownHostException e) { e.printStackTrace(); } return ip; } public String getName() { String name = null; try { InetAddress myLocalHost = InetAddress.getLocalHost(); name = myLocalHost.getHostName(); } catch (UnknownHostException e) { e.printStackTrace(); } return name; } /***************************** 事件监听 *****************************/ public void message() { createServer.addActionListener(this); searchServer.addActionListener(this); sendMessage.addActionListener(this); } @Override public void actionPerformed(ActionEvent e) { if (e.getSource() == createServer && lock==0) { text3.setText(""); text3.append("服务器名称为:" + getName() + "\n"); text3.append("服务器IP为:" + getIp() + "\n"); text3.append("端口号为:6666\n"); text3.append("服务器已经启动,正在监听.......\n"); this.startServer(); scan=1; } else if(e.getSource() == createServer && lock==1){ try { serverSocket.close(); text3.setText(""); text3.append("服务器关闭成功"); lock=0; } catch (IOException e1) { text3.append("服务器关闭异常"); e1.printStackTrace(); } }else if (e.getSource() == searchServer) { text4.setText(""); text4.append("正在搜索服务器,请稍等.....\n"); this.startClient(); scan=0; } else if (e.getSource() == sendMessage) { if (scan == 1) {// 服务器端 try { outputFromServer = new DataOutputStream( serverSocket.getOutputStream()); String name = getName(); if (text2.getText().length() > 0) { text1.append(name + "说: " + text2.getText() + "\n"); outputFromServer.writeUTF(this.getName()+","+text2.getText());// 写入消息 text2.setText(""); } else { text2.setText("\n\n请输入内容\n\n"); Thread.sleep(1000); text2.setText(""); } } catch (InterruptedException | IOException e1) { e1.printStackTrace(); } } else if (scan == 0 ) {// 客户端 try { outputFromClient = new DataOutputStream( clientSocket.getOutputStream()); String name = getName(); if (text2.getText().length() > 0 ) { text1.append(name + "说: " + text2.getText()+ "\n"); outputFromClient.writeUTF(this.getName()+","+text2.getText());// 写入消息 text2.setText(""); } else if(text2.getText().length() <= 0) { text2.setText("\n\n请输入内容\n\n"); Thread.sleep(1000); text2.setText(""); } } catch (InterruptedException | IOException e1) { e1.printStackTrace(); } } } } /***************************** 启动服务器 *************************************/ public void startServer() { try { if(lock==0){ server = new ServerSocket(6666); serverSocket = server.accept(); createServer.setLabel("停止服务器"); lock=1; } } catch (IOException e) { text3.setText(""); text3.append("服务器启动错误,请重新设置后启动!\n可能是由于:\n"); text3.append("1.端口被占用。\n"); text3.append("2.服务器已经启动。\n"); e.printStackTrace(); } } /***************************** 启动客户端 *************************************/ public void startClient() { try { clientSocket = new Socket("192.168.31.125",6666);//更改为自己服务器主机的IP地址即可 text4.append("连接成功 "); searchServer.setLabel("断开连接"); } catch (Exception e) { text4.append("无法连接网络"); e.printStackTrace(); } } /******************************* 对话内容互相显示 *****************************/ public void messageDisplay() throws IOException { // 接收消息 if (scan == 1) {// 客户端 inputToClient = new DataInputStream(serverSocket.getInputStream()); String receive = inputToClient.readUTF(); String[] message=receive.split(","); text1.append(message[0]+"说: "+message[1]+"\n"); }else if(scan == 0){//服务器端 inputToServer = new DataInputStream(clientSocket.getInputStream()); String receive = inputToServer.readUTF(); String[] message=receive.split(","); text1.append(message[0]+"说: "+message[1]+"\n"); } } /***************************** 创建主界面 *************************************/ private void launchFrame() { // /////////上面部分///////////// topPanel_1 = new Panel(); ipLabel = new Label("IP地址");// 标签 ipTextField = new TextField(getIp(), 19); localNameLabel = new Label("本机名称"); localNameField = new TextField(getName(), 19); createServer = new Button("创建服务器"); searchServer = new Button("搜索服务器"); // /////////中部部分///////////// midPanel_left = new Panel(); midPanel_right = new Panel(); text1 = new TextArea(20, 68); text2 = new TextArea(3, 68); text3 = new TextArea(14, 25); text4 = new TextArea(9, 25); // /////////底部部分///////////// downPanel_1 = new Panel(); sendMessage = new Button("发送"); topPanel_1.add(ipLabel);// 加入面板 topPanel_1.add(ipTextField); topPanel_1.add(localNameLabel); topPanel_1.add(localNameField); topPanel_1.add(createServer); topPanel_1.add(searchServer); midPanel_left.setLayout(new BorderLayout()); midPanel_right.setLayout(new BorderLayout()); midPanel_left.add(text1, BorderLayout.NORTH); midPanel_left.add(text2, BorderLayout.SOUTH); midPanel_right.add(text3, BorderLayout.NORTH); midPanel_right.add(text4, BorderLayout.SOUTH); downPanel_1.add(sendMessage); Container container = getContentPane();// 布局管理器 container.setLayout(new BorderLayout());// 布局声明 container.add(topPanel_1, BorderLayout.NORTH); container.add(midPanel_left, BorderLayout.CENTER); container.add(midPanel_right, BorderLayout.EAST); container.add(downPanel_1, BorderLayout.SOUTH); this.pack();// 调整此窗口的大小,以适合其子组件的首选大小和布局。 setSize(700, 500);// 设置面板宽与高 setTitle("点星光聊天");// 设置标题 setResizable(false);// 大小不可变 setVisible(true);// 设置面板可见 this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);// 关闭时释放资源 } public static void main(String[] args) throws IOException { Chat chat = new Chat(); chat.launchFrame(); chat.message(); while(true){ chat.messageDisplay(); } } @Override public void run() { // TODO 自动生成的方法存根 }
}
相关文章推荐
- C#基于TCP&UDP实现服务器与多个客户端之间的通信(客户端之间直接通信,不靠服务器端转发消息)
- 基于TCP 实现客户端之间通信【1】
- Java基于TCP实现服务器和多客户端之间的通信
- C# 基于TcpListener和TcpClient的客户端服务端通信
- tcp客户端与服务端之间的通信实例
- 某实例+修改 Winsock实现基于TCP的客户端/服务器通信
- Linux socket编程入门及客户端服务器端通信实现 – 提高篇:TCP连接过程分析
- java 客户端与c++服务器端tcp通信 demo
- 基于TCP网络通信的自动升级程序源码分析-客户端接收文件
- 【c#源码】基于TCP通信的客户端断线重连
- 用TcpTrace监控OpenERP客户端和服务器之间的通信
- 基于TCP网络通信的自动升级程序源码分析-客户端接收文件
- 基于TCP网络通信的自动升级程序源码分析-客户端接收文件
- 基于Tcp通信的聊天程序微风IM(c#开源) -技术分析(三) 客户端下线
- 【c#源码】基于TCP通信的客户端断线重连
- 解决workshop开发的服务器端与axis开发的客户端之间的交互通信问题
- c#中异步基于消息通信的完成端口的TCP-IP协议的组件实现(服务器端-源代码)
- java与c语言之间的socket通信—java客户端c服务器端
- 基于TCP网络通信的自动升级程序源码分析-客户端连接服务器
- 基于TCP服务器端,客户端的上传任意文件Demo