简单服务器与客户端传输信息
Test4.java
~~~
package chat.a3;
import javax.swing.*;
import java.io.*;
import java.net.*;
import java.awt.event.*;
public class Test4 extends JFrame implements ActionListener{
JTextArea jta =null;//文本域
JButton jb =null;//按钮
JTextField jtf=null;//文本框
JPanel jp =null;//标签
JScrollPane jsp=null;//滚动条
PrintWriter pw=null;
public static void main(String[] args) {
Test4 t = new Test4();
}
public Test4(){
jta =new JTextArea();
jb =new JButton("发送");
jb.addActionListener(this);
jtf =new JTextField(20);
jp =new JPanel();
jp.add(jtf);jp.add(jb);
jsp =new JScrollPane(jta);
this.add(jsp);this.add(jp,"South");
this.setTitle("服务器端");
this.setSize(350,250);
this.setLocation(300, 200);
this.setResizable(false);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);
try {
ServerSocket ss=new ServerSocket(9999);
Socket s=ss.accept();//接收服务器传过来的信息
InputStreamReader isr=new InputStreamReader(s.getInputStream());
BufferedReader br = new BufferedReader(isr);
pw =new PrintWriter(s.getOutputStream(),true);
while(true){
String xinxi=br.readLine();
jta.append("客户端对我说:"+xinxi+"\r\n");
}
} catch (Exception e) {
// TODO: handle exception
}
}
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
if(e.getSource()==jb){
String xinxi =jtf.getText();
jta.append("我对客户端说:"+xinxi+"\r\n");
pw.println(xinxi);
jtf.setText("");//清空文本框
}
}
}
~~~
Test5.java
~~~
package chat.a3;
import javax.swing.*;
import java.io.*;
import java.net.*;
import java.awt.event.*;
public class Test5 extends JFrame implements ActionListener{
JTextArea jta =null;//文本域
JButton jb =null;//按钮
JTextField jtf=null;//文本框
JPanel jp =null;//标签
JScrollPane jsp=null;//滚动条
PrintWriter pw=null;
public static void main(String[] args) {
Test5 t = new Test5();
}
public Test5(){
jta =new JTextArea();
jb =new JButton("发送");
jb.addActionListener(this);
jtf =new JTextField(20);
jp =new JPanel();
jp.add(jtf);jp.add(jb);
jsp =new JScrollPane(jta);
this.add(jsp,"Center");this.add(jp,"South");
this.setTitle("客户端");
this.setSize(350,250);
this.setLocation(300, 200);
this.setResizable(false);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);
try {
Socket s=new Socket("127.0.0.1",9999);
InputStreamReader isr=new InputStreamReader(s.getInputStream());
BufferedReader br = new BufferedReader(isr);
pw =new PrintWriter(s.getOutputStream(),true);
while(true){
String xinxi=br.readLine();
jta.append("服务器对我说:"+xinxi+"\r\n");
}
} catch (Exception e) {
// TODO: handle exception
}
}
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
if(e.getSource()==jb){
String xinxi =jtf.getText();
jta.append("我对服务器说:"+xinxi+"\r\n");
pw.println(xinxi);
jtf.setText("");//清空文本框
}
}
}
~~~
先启动服务器Test.java,再启动客户端Test1.java
结果:
![](https://box.kancloud.cn/67e1aa52e95bc834544cae0d28fde9eb_764x283.png)
- 书写心得
- 基础回顾
- 异常的处理
- equils方法
- 集合类
- ArrayList的遍历和添加
- ArrayList的删除插入
- 实例:食品库存管理
- HashMap
- 集合类的区别和选择
- 泛型和反射机制
- 图形化用户界面(GUI)
- JFrame容器
- 边界布局管理器
- 流式布局管理器
- 网格布局管理器
- Jpanel面板
- 文本框和标签
- 单选按钮和复选按钮
- 下拉列表框和滚动条
- 拆分窗口
- 聊天窗口
- 用户登录界面
- 记事本界面
- 线程
- 创建线程的方法
- 线程的优先级
- 线程的睡眠
- 线程的让步与阻塞
- 买票问题
- 生产消费问题
- IO流
- 字符流
- 字节流
- 缓冲流
- 数据流传输
- 转换流
- 空字符串区别
- Print流
- Object
- IO流补充
- 绘图技术和事件处理机制
- 绘图基础-绘制图形
- 绘图基础-绘制图像
- 绘图基础-绘制文字
- 事件处理-事件监听
- 事件处理-控件事件
- 事件处理-键盘事件
- 事件处理-鼠标事件
- 事件处理-窗口事件
- 记事本
- 坦克大战
- 阶段1
- 阶段2
- 阶段3
- 阶段4
- 阶段5
- 阶段6
- 阶段7
- 阶段8
- 阶段9
- 阶段10
- 阶段11
- 阶段12
- 阶段13
- 阶段14
- SQL Server 2005
- 简易学生管理系统
- 阶段(1)-显示
- 阶段(2)-查询
- 阶段(3)-添加
- 阶段(4)-删除
- 阶段(5)-修改
- 简易餐饮管理系统
- 阶段-01
- 阶段-02
- 阶段-03
- 阶段-04
- Index.java
- Login.java
- Main.java
- MyFont.java
- ImagePanel.java
- Conn.java
- Moxing.java
- 网络编程基础
- 互发信息(1)-传输
- 互发信息(2)-互发
- 互发信息(3)-GUI
- 互发信息(4)-对象流
- 网络聊天工具
- 阶段--01--界面
- Server
- Index
- Client
- Login
- Chat
- List