Chat_Server.java
import java.io.EOFException;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.BindException;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketException;
import java.util.ArrayList;
public class Chat_Server {
ServerSocket server=null;
//ObjectInputStream input=null;
boolean isStart=false;//服务端是否启动
boolean isConnect=false;//客户端是否连接上
ArrayList<Client_Thread> clients=
new ArrayList<Client_Thread>();
public static void main(String[] args) {
new Chat_Server().startServer();
}
private void startServer(){
System.out.println("服务端已启动");
try{
server=new ServerSocket(8888);
isStart=true;
}catch(BindException e){
System.out.println("端口使用中....");
System.exit(0);
}catch(IOException e){
e.printStackTrace();
System.exit(0);
}
try {
while(isStart){
Socket client=server.accept();
//客户端连接成功后,为客户端创建一个独立的线程接受消息
Client_Thread client_thread=
new Client_Thread(client);
new Thread(client_thread).start();//启动线程
clients.add(client_thread);//添加
}
}catch(Exception e){
e.printStackTrace();
}
finally{
try {
server.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
/*
* 每当一个客户端连接到服务器都会创建一个如此的线程
*/
class Client_Thread implements Runnable{
//类里边保留socket、inputStream
private Socket s=null;
private ObjectInputStream in=null;
private ObjectOutputStream output=null;
private boolean isConnect=false;
Client_Thread(Socket s){
this.s=s;
try {
in=new ObjectInputStream(s.getInputStream());
output=new ObjectOutputStream(s.getOutputStream());
isConnect=true;
} catch (IOException e) {
// TODO Auto-generated catch block
System.out.println("Client_Thread");
e.printStackTrace();
}
}
public void send(String str){
try {
output.writeObject(str);
output.flush();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void run() {
System.out.println("服务端监听已启动");
String str;
try {
while(isConnect){
str = (String)in.readObject();
System.out.println(str);
for(int i=0;i<clients.size();i++){
Client_Thread c=clients.get(i);
c.send(str);
}
}
} catch (SocketException e) {
System.out.println("客户端已关闭");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
finally{
try {
if(in!=null) in.close();
if(output!=null) output.close();
s.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
Chat_Client.java
import java.awt.BorderLayout;
import java.awt.Frame;
import java.awt.TextArea;
import java.awt.TextField;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.Socket;
import java.net.UnknownHostException;
public class Chat_Client extends Frame{
TextField textField=new TextField();
TextArea textArea=new TextArea();
String str=null;
Socket client;
ObjectOutputStream output=null;
ObjectInputStream input=null;
boolean isConnected=false;
public static void main(String[] args) {
new Chat_Client().launchFrame();
}
public Chat_Client(){
connect();
new Thread(new ClientOwnThread()).start();
}
public void launchFrame(){
this.setLocation(400,300);
this.setSize(300,300);
this.add(textArea,BorderLayout.NORTH);
this.add(textField,BorderLayout.SOUTH);
this.pack();
textArea.setEditable(false);
this.setVisible(true);
this.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){
System.exit(0);
}
});
textField.addActionListener(new TextFieldListener());
}
private void connect(){
try {
client=new Socket("127.0.0.1",8888);
output=new ObjectOutputStream(client.getOutputStream());
input=new ObjectInputStream(client.getInputStream());
isConnected=true;
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
private void disConnect(){
try {
if(output!=null) output.close();
if(input!=null) input.close();
if(client!=null) client.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
class ClientOwnThread implements Runnable{
public void run() {
try {
while(isConnected){
String str=(String)input.readObject();
textArea.append(str+"\n");
}
} catch (Exception e) {
e.printStackTrace();
}
finally{
disConnect();
}
}
}
private class TextFieldListener implements ActionListener{
public void actionPerformed(ActionEvent arg0) {
str=textField.getText().trim();
textField.setText("");
try {
output.writeObject(str);
output.flush();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
分享到:
相关推荐
2019最新Python——GUI_tkinter学习资料整理,可直接当作手册使用参考,网络资料文档整理
电子版的Python GUI设计之Tkinter菜鸟编程,一般是扫描图片组成的PDF或网页版 ,不支持查找操作,特整理成Word版并分享。
java教程书籍
java学习进阶之路,如果从一个菜鸟进阶成大神(csdn)————程序
运用Java和SQL设计管理系统,对于初学java的人来说,是很好的资料,里面包括源代码
Android菜鸟成长笔记(十三)——碎片(一)一篇完整源码 地址:http://blog.csdn.net/zenail501129/article/details/25473829 保证代码正确。
个人总结,集10年开发经验,精挑细选!不要错过哦。非常经典,非常实在的资料.轻松上手,附上经典实例,
java菜鸟学习第一步-java基础语法,学习一门语言先从语法开始学起,学好基础才能深入的学习编程
菜鸟成长手册2009——CPU-内存-硬盘篇 - 硬件知识精华菜鸟成长手册2009——CPU-内存-硬盘篇 - 硬件知识精华菜鸟成长手册2009——CPU-内存-硬盘篇 - 硬件知识精华菜鸟成长手册2009——CPU-内存-硬盘篇 - 硬件知识精华...
菜鸟学装机系列之八——图解跳线设置借鉴.pdf
系统、全面的java编程基础资料讲解,让你从一名菜鸟,熟练掌握基础编程。
runoob菜鸟教程的打包JAVA教程,非常好的资源,值得学习!
本书以包罗万象的IT大江湖为背景,将Java职场中从入门前的学校菜鸟成长为技术大牛的过程展现给读者,内容饱满但又不失趣味性。在本书中既有入职前的行业探秘、误区排除,也有入职后的口诀传授和江湖新锐兵器介绍。...
王牌9_优秀程序员之路——Visual_C++开发经验及技巧大汇总详细的讲解了程序员如何从菜鸟变成编程高手
菜鸟成长之路—Java程序员职场全攻略
大厂真题之菜鸟网络-Java初级.pdf
java程序员由菜鸟到笨鸟 作者:曹胜欢
贪吃蛇小游戏代码 菜鸟专为Java这准备 本人已运行过 编程初学者非常适用 教你怎样运用