java中基于tcpsocket的一对一简单聊天室
江苏经贸职业技术学院
信息技术学院
2015-2016-2学年
《网络编程技术(java)》课程期末大作业
姓名: 高文顶
学号: 1426040147
班级: 14网络
专业: 计算机网络技术 作品名称: 模仿QQ的简单即时通信工具
2016年4月
一、程序功能简介
本程序拥有图形界面和一对一聊天程序,实现监听连接、发送、退出功能。先启动Server服务器端程序进行端口监听,然后启动Client客户端连接Server端IP地址和端口号,Server端监听到后显示连接成功,可以进行通信。
二、运行界面截图
(一)界面主程序
(二)客户端程序
三、核心代码说明
(一)Client.java核心代码说明示例 packagegwd;
importjava.awt.*;
importjava.awt.event.*; import java.io.*;
importjava.net.InetAddress; importjava.net.InetSocketAddress;
importjava.net.Socket; importjava.net.UnknownHostException;
importjavax.swing.*;
importjavax.swing.border.EmptyBorder;
publicclass Client extendsJFrameimplements Runnable, ActionListener,
KeyListener {
privatestaticfinallongserialVersionUID = 8518610966119429018L;
privateJScrollPanetextPane;//滚动条
privateJLabelpcLabel,portLabel;//标签
privateJTextAreachatArea;//聊天内容区域
privateJTextFieldpctextField,porttextField,sendField;//文本框
privateJButtonconnectButton,sendButton;//按钮
private Socket socket;//客户端套接字对象
privateDataInputStreamin;//数据输入流对象
privateDataOutputStreamout;//数据输出流对象
private Thread thread;//线程
privateJComboBoxnamecomboBox;//下拉列表框
public Client() {
createUserInterface();//调用图形界面
setTitle("客户端");//设置标题
setSize(550,500);//设置宽度和高度
setResizable( false );//禁用界面最大化
setLocationRelativeTo(null);//自动释放大小
setVisible(true);//窗口显示出来
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//点击关闭默认关
闭窗口
}
publicvoidcreateUserInterface() {
setLayout(null);//设置布局
JPanelcontentPane=newJPanel();//创建顶部 panel
contentPane.setBounds(5, 5, 525 , 50);//设置panel坐标
add(contentPane);//添加控件到窗口屏幕中
pcLabel = newJLabel("主机:");//创建主机标签
contentPane.add(pcLabel);
pctextField = newJTextField();//创建主机文本框
contentPane.add(pctextField);
pctextField.setColumns(10);
portLabel = newJLabel("端口");//创建端口标签
contentPane.add(portLabel);
porttextField = newJTextField();//创建端口文本框
porttextField.setColumns(10);
contentPane.add(porttextField);
namecomboBox = newJComboBox();//创建下拉列表框
namecomboBox.addItem( "张三" );//设置值
namecomboBox.addItem( "李四" );//设置值
namecomboBox.setSelectedIndex( 0 );
namecomboBox.setEditable(true);//设置允许选择
contentPane.add(namecomboBox);
chatArea = newJTextArea();//创建聊天内容区域
chatArea.setLineWrap(true); //设置换行
textPane = newJScrollPane(chatArea);//滚动条
textPane.setBounds(5, 60, 525, 360);
add(textPane);
sendButton = newJButton("发送");//创建发送按钮
sendButton.setBounds(355, 430, 80, 24);
sendButton.addKeyListener(this);//绑定发送按钮键盘对象
sendButton.addActionListener(this);//绑定发送按钮点击对象
add(sendButton);
sendField = newJTextField(255);//创建发送文本框
sendField.setBounds(5, 430, 330, 24);
sendField.addKeyListener(this);//发送文本框绑定键盘事件
add(sendField);
connectButton = newJButton("连接");//创建连接按钮
connectButton.setBounds(450, 430, 80, 24);
connectButton.addActionListener(this);//绑定连接按钮对象
contentPane.add(connectButton);
socket = new Socket();//创建客户端Sokcet对象
thread = new Thread(this);//创建线程对象
}
publicvoid connect() { //创建客户端Socket套接字
try {
if (!socket.isConnected()) { //判断套接字是否连接成功
InetAddressaddress =
InetAddress.getByName(pctextField.getText());//获取本地IP地址对象
InetSocketAddresssocketAddress =
newInetSocketAddress(address,
Integer.parseInt(porttextField.getText()));//创建InetSocketAddress对象
socket.connect(socketAddress);//连接服务器
in = newDataInputStream(socket.getInputStream());//创建数
据输入流对象
out = newDataOutputStream(socket.getOutputStream());//创建数据输出流对象
sendButton.setEnabled(true);//启动发送按钮
if (!(thread.isAlive())) { //判断线程是否激活
thread = new Thread(this);//创建线程对象
}
thread.start();//启动线程
}
} catch (Exception e) {
System.out.println(e);
socket = new Socket();//创建Socket对象
}
}
publicvoid send() { //向客户端发送消息
String msg = sendField.getText().trim();//获取发送消息内容
if (msg.isEmpty()) { //判断是否为空
JOptionPane.showMessageDialog(this, "请输入发送消息.");//提示消息
return;
}
chatArea.append(namecomboBox.getSelectedItem()+": " + msg + "\n");//追加文本到聊天内容区域中
try {
out.writeUTF(namecomboBox.getSelectedItem()+": "+msg);//发送消息到客户端
sendField.setText("");//清空消息
} catch (Exception e) {
e.printStackTrace();
}
}
publicvoidactionPerformed(ActionEventarg0) { //点击事件
if (arg0.getSource() == sendButton) { //发送按钮
send();//发送消息
} elseif (arg0.getSource() == connectButton) { //连接对象
connect();//启动客户端套接字对象
}
}
publicvoid run() { //启动线程
if (Thread.currentThread() == thread) { //判断是否当前线程
String msg = null;
while (true) { //循环接收客户端消息
try {
msg = in.readUTF();//将数据读取出来
chatArea.append("服务器: " + msg + "\n");//显示文本域中
} catch (IOExceptione) {
e.printStackTrace();
socket = new Socket();
break;
}
}
}
}
publicvoidkeyPressed(KeyEventarg0) { // 键盘按下
if (arg0.getKeyCode() == KeyEvent.VK_ENTER) {
send();//发送消息
}
}
@Override
publicvoidkeyReleased(KeyEventarg0) {
}
@Override
publicvoidkeyTyped(KeyEventarg0) {
}
publicstaticvoid main(String[] args) {
EventQueue.invokeLater(new Runnable() {
publicvoid run() {
try {
Client frame = newClient();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
}
二、Server.java核心代码说明示例
packagegwd;
importjava.awt.*;
importjavax.swing.*;
importjavax.swing.border.EmptyBorder;
importjava.awt.event.*;
importjava.io.BufferedReader; importjava.io.InputStreamReader; importjava.io.PrintWriter; importjava.net.ServerSocket; importjava.net.Socket;
importjava.awt.event.ActionEvent; importjava.awt.event.ActionListener; importjava.awt.event.KeyEvent; importjava.awt.event.KeyListener; importjava.io.DataInputStream; importjava.io.DataOutputStream; importjava.io.IOException;
importjavax.swing.JButton; importjavax.swing.JFrame; importjavax.swing.JOptionPane; importjavax.swing.JPanel; importjavax.swing.JScrollPane; importjavax.swing.JTextArea; importjavax.swing.JTextField;
public class Server extends JFrame implements Runnable, ActionListener, KeyListener {
private JScrollPanetextPane;//滚动条
private JLabelportLabel;//标签
private JTextAreachatArea;//聊天内容区域
private JTextFieldportField,sendField;//文本框
private JButtonsendButton,startButton;//按钮
private ServerSocketserversocket;//服务器套接字对象
private Socket socket;//客户端套接字对象
private DataInputStream in;//数据输入流对象
private DataOutputStream out;//数据输出流对象
private Thread thread;//线程
public Server() {
createUserInterface();//调用图形界面
setTitle("服务器");//设置标题
setSize(550,500);//设置宽度和高度
setResizable( false );//禁用界面最大化
setLocationRelativeTo(null);//自动释放大小
setVisible(true); //显示出来
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//点击关闭默认关闭窗口
}
public void createUserInterface() {
setLayout(null);//设置布局
JPanelcontentPane=new JPanel();//创建顶部 panel
contentPane.setBounds(5, 5, 525, 50);//设置panel坐标
add(contentPane);
portLabel = new JLabel("端口");//创建端口标签
contentPane.add(portLabel);
portField = new JTextField();//创建端口文本框
contentPane.add(portField);
portField.setColumns(10);
chatArea = new JTextArea();//创建聊天内容区域
chatArea.setLineWrap(true);//设置换行
textPane = new JScrollPane(chatArea);//滚动条
textPane.setBounds(5, 60, 525, 360);
add(textPane);
sendButton = new JButton("发送");//创建发送按钮
sendButton.setBounds(355, 430, 80, 24);
sendButton.addActionListener(this);//绑定发送按钮点击对象
add(sendButton);
sendField = new JTextField(255);//创建发送文本框
sendField.setBounds(5, 430, 330, 24);
sendField.addKeyListener(this);//消息框绑定键盘事件监听
add(sendField);
startButton = new JButton("启动");//创建启动按钮
startButton.setBounds(450, 430, 80, 24);
startButton.addActionListener(this);//绑定启动按钮对象
contentPane.add(startButton);
thread = new Thread();//创建线程对象
}
public void connect() { //创建服务器ServerSocket套接字
try {
chatArea.append("请稍等...\n");//添加文本到聊天内容区域中
serversocket = new ServerSocket(Integer.parseInt(portField.getText()));//创建ServerSocket套接字对象
socket = serversocket.accept();//接收客户端套接字对象
chatArea.append("连接成功... \n");//追加信息到聊天内容区域中,显示成功连接服务器
in = new DataInputStream(socket.getInputStream());//创建数据输入流对象
out = new DataOutputStream(socket.getOutputStream());//创建数据输出流对象
if (!thread.isAlive()) { //判断线程是否激活
thread = new Thread(this);//创建线程对象
}
thread.start();//启动线程
} catch (Exception e) {
System.out.println(e);
try {
serversocket = new ServerSocket();//创建ServerSocket套接字对象
} catch (IOException e1) {
e1.printStackTrace();
}
}
}
public void send() { //向客户端发送消息
String msg = sendField.getText().trim();//获取发送消息内容
if (msg.isEmpty()) { //判断是否为空
JOptionPane.showMessageDialog(this, "请输入发送消息.");//提示消息
return;
}
chatArea.append("服务器: " + msg + "\n");//追加文本到聊天内容区域中
try {
out.writeUTF(msg);//发送消息到客户端
sendField.setText("");
} catch (Exception e) {
e.printStackTrace();
}
}
public void actionPerformed(ActionEvent arg0) { //键盘事件
if (arg0.getSource() == sendButton) { //发送按钮
send();//发送消息
} else if (arg0.getSource() == startButton) { //连接对象
connect();//启动服务器套接字对象
}
}
public void run() { //启动线程
if (Thread.currentThread() == thread) { //判断是否当前线程
String msg = null;
while (true) { //循环接收客户端消息
try {
msg = in.readUTF();//将数据读取出来
chatArea.append(msg + "\n");//显示在聊天内容区域中
} catch (IOException e) {
e.printStackTrace();
try {
serversocket = new ServerSocket(4331);
} catch (IOException e1) {
e1.printStackTrace();
}
break;
}
}
}
}
public void keyPressed(KeyEvent arg0) { // 键盘按下
if (arg0.getKeyCode() == KeyEvent.VK_ENTER) {
send();//发送消息
}
}
@Override
public void keyReleased(KeyEvent arg0) {
}
@Override
public void keyTyped(KeyEvent arg0) {
}
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
Server frame = new Server();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
}
四、创新点说明
本程序基于TCPsocket实现网络即时通信,客户端可用多种
身份与服务器端聊天,方便、快捷、易懂。
本文档为【java中基于tcpsocket的一对一简单聊天室】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑,
图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。