服务端对try catch finally重新进行了定义,当发生异常,主动提示,或关闭出现异常的socket

服务器端代码修改如下:

package com.swift;

import java.io.DataInputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket; public class ChatServer { public static void main(String[] args) {
boolean started=false;
ServerSocket ss=null;
DataInputStream dis=null;
Socket s = null;
try {
ss = new ServerSocket(8888);
started=true;
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
try {
while(started) {
boolean connected=false;
s = ss.accept();
connected=true;
System.out.println("a client connected success");
dis=new DataInputStream(s.getInputStream());
while(connected) {
String str=dis.readUTF();
System.out.println(str);
}
}
} catch (Exception e) {
//e.printStackTrace();
System.out.println("client has closed.");
}finally {
if(dis!=null) {
try {
dis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(s!=null) {
try {
s.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
} }

客户端换了一个OutputStream,使用DataOutputStream发送信息,dos.writeUTF(tf.getText());

0.6版效果图

客户端代码修改如下:

package com.swift;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException; import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField; public class ChatClientFrame extends JFrame { private static final long serialVersionUID = -118470059355655240L;
Socket s=null;
DataOutputStream dos=null;
JLabel label_shang=new JLabel();
JLabel label_xia=new JLabel();
JTextField tf = new JTextField(38);
JTextArea ta = new JTextArea(15, 50);
JButton button=new JButton(); public ChatClientFrame() {
setBounds(200, 200, 500, 400);
setTitle("客户端聊天工具 —— 0.6");
//对窗口进行大的布局,分为三行一列,在pBasic面板上添加三个面板shang zhong xia
JPanel pBasic=new JPanel();
pBasic.setLayout(new BorderLayout());//不设置默认也是这种布局模式
setContentPane(pBasic);//把面板放在窗口上,不记得用this.关键字
JPanel shang=new JPanel();
JPanel zhong=new JPanel();
JPanel xia=new JPanel();
//设置JPanel面板的大小
shang.setSize(470, 25);
zhong.setSize(470, 180);
xia.setSize(470, 40);
pBasic.add(shang,BorderLayout.NORTH);
pBasic.add(zhong,BorderLayout.CENTER);
pBasic.add(xia,BorderLayout.SOUTH);
shang.setBackground(Color.red);
zhong.setBackground(Color.yellow);
xia.setBackground(Color.blue); label_shang.setText("聊天记录");
shang.add(label_shang);
ta.setLineWrap(true);// 自动换行
JScrollPane scroll=new JScrollPane(ta);// 增加滚动条,以便不增加行数
zhong.add(scroll);
label_xia.setText("输入信息");
xia.add(label_xia,BorderLayout.WEST);
/*
* 增加功能,窗口监听事件,窗口打开时设置光标焦点在tf文本域中
*/
this.addWindowListener(new WindowAdapter() {
@Override
public void windowOpened(WindowEvent e) {
tf.requestFocus();
}
});
xia.add(tf,BorderLayout.CENTER);
button.setText("发送");
xia.add(button,BorderLayout.EAST); final class ShareListener implements ActionListener{ @Override
public void actionPerformed(ActionEvent e) {
String taText=ta.getText();
String tfText=tf.getText()+"\r\n";
String tfText1=tf.getText();
ta.setText(taText+tfText);
tf.setText("");
//当回车或发送按钮时,tfText发送到服务器
try {
dos.writeUTF(tfText1);
dos.flush();
} catch (IOException e1) {
e1.printStackTrace();
} }
}
button.addActionListener(new ShareListener());
tf.addActionListener(new ShareListener());
//通过压缩自动调整各个面板
pack();
this.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
disconnect();
System.exit(0);
}
});
setVisible(true);
//创建窗体直接调用连接服务器
connect();
} public void connect() {
try {
s=new Socket("127.0.0.1",8888);
System.out.println("connected!");
dos=new DataOutputStream(s.getOutputStream()); } catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
public void disconnect() {
try {
dos.close();
s.close();
} catch (IOException e) {
e.printStackTrace();
}
} public static void main(String[] args) {
new ChatClientFrame();
} }

最新文章

  1. Linux From Scratch(从零开始构建Linux系统,简称LFS)- Version 7.7(二)
  2. easyui datagird 列宽自适应
  3. Java事务处理全解析(五)—— Template模式
  4. 有关Flash Player的内存管理及泄露检测
  5. 一款安卓ShowcaseView视图源码效果
  6. 对进度条progressbar的调整
  7. ASP.NET MVC 后台接收集合参数和 jquery ajax 传值
  8. zabbix log(logrt) key的使用
  9. Android 自定义View 画圆 画线
  10. 几个关于JPEGLIB库的博客
  11. HDU1865--More is better(统计并查集的秩(元素个数))
  12. WPF 中模拟键盘和鼠标操作
  13. fastadmin系统配置
  14. Ext需要的文件目录
  15. 各大APP注册时发送短信验证码是怎么实现的?
  16. Redis数据备份、安全、管理服务器笔记
  17. 12款优秀 jQuery Ajax 分页插件和教程
  18. 课程 python 文件操作复习
  19. Php自动备份数据库实现方法
  20. PHP权限控制(转)

热门文章

  1. Educational Codeforces Round 20 C(math)
  2. 2018全球十大测试工具Top2 Katalon
  3. Matlab图像处理相关
  4. 【NOI省选模拟】小奇的花园
  5. 单片机C基本编程规范
  6. Java并发编程笔记
  7. ZOJ 4033 CONTINUE...?(The 15th Zhejiang Provincial Collegiate Programming Contest Sponsored by TuSimple)
  8. [題解](單調隊列/水)luogu_P3088擠奶牛
  9. c# 参数传递问题(形参与实参)
  10. Linux下命令行中的复制和粘贴