java client 聊天_使用 Java 创建聊天客户端-2

1.项目截图

ffc9f147a903632b41e56cc4afd759c2.png

java聊天核心代码:

MyJavaChatClient

====================================================================================================================================

ChatManager.java

package com.nantian.javachatclient.main;

import java.io.BufferedReader;

import java.io.BufferedWriter;

import java.io.IOException;

import java.io.InputStreamReader;

import java.io.OutputStream;

import java.io.OutputStreamWriter;

import java.io.PrintWriter;

import java.net.Socket;

import com.nantian.javachatclient.view.MainWindow;

public class ChatManager {

//界面中只能向chatManager发送数据,那么接收到数据后怎样放到界面上呢?

//需要对MainWindow有个引用,并为它实现setWindow方法

MainWindow window;

//创建本地socket对象

Socket socket;

//声明ip

String IP;

//输入流

BufferedReader reader;

//输出流

PrintWriter writer;

public void setWindow(MainWindow window) {

this.window=window;

//传递之后

window.appendText("文本框已经和ChatManager绑定了!");

}

//将类单例化的步骤就是讲他的构造方法变成private

//ChatManager就会有唯一的实例

private ChatManager() {}

private static final ChatManager instance=new ChatManager();

public static ChatManager getChatManager() {

return instance;

}

//具体实现连接服务器的操作

public void connect(String ip) {

this.IP=ip;

//呼叫连接的时候需要创建新的线程

new Thread() {

//覆盖thread的run方法

@Override

public void run() {

//核心内容处理方法

try {

socket=new Socket(IP,12345);

//将OutPutStream包装成OutPutStreamWriter,然后再包装成PrintWriter

writer=new PrintWriter(

new OutputStreamWriter(

socket.getOutputStream()));

//读取的输入流

reader=new BufferedReader(

new InputStreamReader(

socket.getInputStream()));

//循环监听当前输入流是否有数据

//本地创建字符串

String line;

//首先让line读取一行数据

while((line=reader.readLine())!=null) {

//输出到界面当中

window.appendText("收到:"+line);

}

//关闭流

writer.close();

reader.close();

//关闭流之后赋值为空

writer=null;

reader=null;

} catch (IOException e) {

e.printStackTrace();

}

}

}.start();

}

//"发送"按钮发送内容函数

public void send(String out) {

//点击"发送"按钮,需要首先判断writer是否为空,不为空继续

if (writer!=null) {

//服务器没有提示在控制台输出内容,这是因为没有添加\n,这时flush才可以将这行内容输出

writer.write(out+"\n");

//强制刷新输出

writer.flush();

}else {

window.appendText("当前的连接已经中断!!!");

}

}

}

====================================================================================================================================

StartClient.java

package com.nantian.javachatclient.main;

import java.awt.EventQueue;

import com.nantian.javachatclient.view.MainWindow;

public class StartClient {

/**

* 将窗体主方法放到了这里

* @param args

*/

public static void main(String[] args) {

EventQueue.invokeLater(new Runnable() {

public void run() {

try {

MainWindow frame = new MainWindow();

frame.setVisible(true);

//创建window的时候,对MainWindow有个引用

ChatManager.getChatManager().setWindow(frame);

} catch (Exception e) {

e.printStackTrace();

}

}

});

}

}

===================================================================================================================================

MainWindow.java

package com.nantian.javachatclient.view;

import java.awt.BorderLayout;

import java.awt.EventQueue;

import javax.swing.JFrame;

import javax.swing.JPanel;

import javax.swing.border.EmptyBorder;

import com.nantian.javachatclient.main.ChatManager;

import javax.swing.JTextArea;

import javax.swing.GroupLayout;

import javax.swing.GroupLayout.Alignment;

import javax.swing.LayoutStyle.ComponentPlacement;

import javax.swing.JTextField;

import javax.swing.JButton;

import java.awt.event.MouseAdapter;

import java.awt.event.MouseEvent;

public class MainWindow extends JFrame {

/**

*

*/

private static final long serialVersionUID = 1L;

private JPanel contentPane;

//文本控件声明到类中,让他作为类的变量

JTextArea txt;

private JTextField IP;

private JTextField send;

/**

* Create the frame.

*/

public MainWindow() {

//因为每次创建客户端会把它压在下面,所以设置如下

setAlwaysOnTop(true);

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

setBounds(100, 100, 450, 300);

contentPane = new JPanel();

contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));

setContentPane(contentPane);

txt = new JTextArea();

txt.setText("Ready...");

IP = new JTextField();

IP.setText("127.0.0.1");

IP.setColumns(10);

JButton button = new JButton("连接到服务器");

button.addMouseListener(new MouseAdapter() {

//mouse-->clicked自动创建的代码

@Override

public void mouseClicked(MouseEvent e) {

//为"连接到服务器"按钮添加动作

//使用函数把它和这个按钮的监听事件绑定起来

ChatManager.getChatManager().connect(IP.getText());

}

});

send = new JTextField();

send.setText("你好!");

send.setColumns(10);

JButton button_1 = new JButton("发送");

button_1.addMouseListener(new MouseAdapter() {

//为"发送"按钮添加动作

@Override

public void mouseClicked(MouseEvent e) {

//当前文本发送呢内容

ChatManager.getChatManager().send(send.getText());

appendText("我说:"+send.getText());

//发送出去后,需要将当前文本框清空

send.setText("");

}

});

GroupLayout gl_contentPane = new GroupLayout(contentPane);

gl_contentPane.setHorizontalGroup(

gl_contentPane.createParallelGroup(Alignment.LEADING)

.addGroup(Alignment.TRAILING, gl_contentPane.createSequentialGroup()

.addGroup(gl_contentPane.createParallelGroup(Alignment.TRAILING)

.addComponent(txt, GroupLayout.DEFAULT_SIZE, 414, Short.MAX_VALUE)

.addGroup(Alignment.LEADING, gl_contentPane.createSequentialGroup()

.addComponent(IP)

.addPreferredGap(ComponentPlacement.RELATED)

.addComponent(button))

.addGroup(gl_contentPane.createSequentialGroup()

.addComponent(send, GroupLayout.DEFAULT_SIZE, 295, Short.MAX_VALUE)

.addPreferredGap(ComponentPlacement.RELATED)

.addComponent(button_1, GroupLayout.PREFERRED_SIZE, 129, GroupLayout.PREFERRED_SIZE)))

.addContainerGap())

);

gl_contentPane.setVerticalGroup(

gl_contentPane.createParallelGroup(Alignment.LEADING)

.addGroup(gl_contentPane.createSequentialGroup()

.addGroup(gl_contentPane.createParallelGroup(Alignment.BASELINE)

.addComponent(IP, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)

.addComponent(button))

.addPreferredGap(ComponentPlacement.RELATED)

.addComponent(txt, GroupLayout.DEFAULT_SIZE, 193, Short.MAX_VALUE)

.addPreferredGap(ComponentPlacement.RELATED)

.addGroup(gl_contentPane.createParallelGroup(Alignment.BASELINE)

.addComponent(send, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)

.addComponent(button_1)))

);

contentPane.setLayout(gl_contentPane);

}

public void appendText(String in) {

txt.append("\n"+in);

}

}

====================================================================================================================================

TestMyServerSocket代码在前面项目

先启动服务端:

11b00918fe5c44d9bc1c13b8d6ec52e9.png

后启动客户端:

d2f0e2e32b19546e722e80fb8228d296.png

9f9ece917f4124863d3195cabd0ab52f.png

断开连接:

f07c240897bc162907163d7284850f0a.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值