聊天室初步代码(socket客户端和服务器端源代码)~
来源:互联网 发布:java 简单工作流 编辑:程序博客网 时间:2024/05/23 01:23
在老师上课的指导下,自己下来又做了好一会~~知识的综合,还是不错的~~用到了“集合”,socket,io流,异常,多线程,聊天室软件,比以前自己写的那个还是进步了不少,以前自学,自己写的那个只能在本机上自己给自己发信息,实在无聊~!现在这个利用多线程,可以利用网络客服端发信息给服务器,服务器再发回给客服端,可以有多个客服端(实质是socket的多线程);虽然,老师多次指出,这个代码很垃圾。不过毕竟这是java写的第一个小东东~~放在空间里,自己想看的时候,可以又回来看看~~!
客服端代码:
package com.myboss.lcl;
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.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Date;
/**1.设置一个客服端的输入的面板继承Frame:
* 【1】设置布局((launch方法) ,textField,textArea,BorderLayout,pack())
* 【2】面板的关闭
* (1)面板关闭时网络连接随之关闭 (disConnect方法:关闭连接时所用到的资源)
* 【3】鼠标事件
* (1)action()方法:鼠标点击textFiled时,将键盘写入的文字发送到textArea上;
* (2)send方法将textField上发送的文字,通过网络,发送给服务器;
* 【4】网络连接:(connect方法)
* (1)客服端socket套接字(ip地址,和端口号);
* (2)利用DataInputStream DataOutputStream传输数据;
* (3) Receive线程类:接收多个客服端socket发送个服务器的信息,再由服务器,反向发回给这多个客服端(用到DataInputStream的readUTF());
* 2.main方法调用launch方法.实现客服端的功能
*/
public class chatClient extends Frame
{
private TextField textField ;
private TextArea textArea ;
private DataInputStream dis ;
private DataOutputStream dos ;
private Socket socket ;
public void launch(){
/*面板的关闭*/
setSize(300,300);
setVisible(true);
addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){
try {
if(dos != null){
dos.writeUTF("BYE-BYE");
}
} catch (IOException e1) {
e1.printStackTrace();
}
disConnect();//面板关闭时网络连接随之关闭 (disConnect方法:关闭连接时所用到的资源)
setVisible(false);
System.exit(0);
}
}
);
String str1 = "请大家文明聊天,谢谢合作!"+"/n";
textField = new TextField();
textArea = new TextArea(str1);
textField.addActionListener(new action());
add(BorderLayout.NORTH,textArea);
add(BorderLayout.SOUTH,textField);
pack();
connect();
}
private void connect() {
/* 网络连接:(connect方法)*/
try {
socket = new Socket("localhost",8200);//客服端socket套接字(ip地址,和端口号);
dis = new DataInputStream(socket.getInputStream());//利用DataInputStream DataOutputStream传输数据;
dos = new DataOutputStream(socket.getOutputStream());
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
Receive receive = new Receive();
new Thread(receive).start();
}
private void disConnect(){
//disConnect方法:关闭连接时所用到的资源
try {
if(dis != null){
dis.close();
dis = null;
}
if(dos != null){
dos.close();
dos = null;
}
if(socket != null){
socket.close();
socket = null;
}
} catch (IOException e) {
e.printStackTrace();
}
}
private class Receive implements Runnable{
/*Receive线程类:接收多个客服端socket发送个服务器的信息,服务器,反向发回给这多个客服端(用到DataInputStream的readUTF())*/
public void run(){
try {
while(socket != null){
String str = dis.readUTF();
textArea.append("---------"+str+"/n");
}
} catch (IOException e) {
//e.printStackTrace();
System.out.println("秘密会话结束,离开聊天室");
}
}
}
public void send() {
/*send方法将textField上发送的文字,通过网络,发送给服务器;*/
try {
dos.writeUTF(textField.getText());
dos.flush();
} catch (IOException e) {
e.printStackTrace();
}
}
private class action implements ActionListener{
public void actionPerformed(ActionEvent e){
String str = textField.getText();
textArea.append("/n"+"你刚刚对大家说:"+str+"----------"+new Date()+"/n");
send();
textField.setText("");
}
}
public static void main(String[] args){
/*main方法调用launch方法,实现客服端的功能*/
new chatClient().launch();
}
}
服务器端:
package com.myboss.lcl;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
/**
* 【1】设置服务器的serivic方法:
* (1)serverSocket接收客服端socket发送过来的信息
* (2)建立一个ArrayList容器类,存储多个客服端socket访问时产生的线程类
* (3)建立一个ThreadClient线程类(有构造函数传递值socket),该线程类负责接收多个客服端socket发过来的信息,并将其显示在服务器(DataInputStream的readUTF()),
* 将ThreadClient接收到的信息通过方法send(String str)方法socket发送回客服端
* 【2】建立一个ThreadClient线程类(有构造函数传递值socket),该线程类负责接收多个客服端socket发过来的信息,并将其显示在服务器(DataInputStream的readUTF()),
* 将ThreadClient接收到的信息通过方法send(String str)方法socket发送回客服端
* (1)释放资源close();
* (2)send方法();
*/
public class chatServer{
private boolean started ;
private boolean connected ;
private List<ThreadClient> clients = new ArrayList<ThreadClient>();
public void service(){
ServerSocket ss = null ;
try{
ss = new ServerSocket(8200);
started = true;
while(started){
Socket socket = ss.accept();//serverSocket接收客服端socket发送过来的信息
System.out.println(socket.getInetAddress()+"欢迎进入聊天室!");
connected = true;
ThreadClient tc = new ThreadClient(socket);//放入多线程的程序;
clients.add(tc);//将产生的线程放入容器类中
new Thread(tc).start();
}
}catch(Exception e){
e.printStackTrace();
}
}
private class ThreadClient implements Runnable{
/*建立一个ThreadClient线程类(有构造函数传递值socket),该线程类负责接收多个客服端socket发过来的信息,并将其显示在服务器(DataInputStream的readUTF()),
* 将ThreadClient接收到的信息通过方法send(String str)方法socket发送回客服端*/
Socket socket ;
DataInputStream dis;
DataOutputStream dos;
public ThreadClient(Socket socket){
this.socket = socket ;
}
public void run(){
try {
dis = new DataInputStream(socket.getInputStream());
dos = new DataOutputStream(socket.getOutputStream());
} catch (IOException e) {
e.printStackTrace();
}
try {
while(connected){
if(dis == null){
return ;
}
String str = dis.readUTF();
if("BYE-BYE".equalsIgnoreCase(str)){
this.close();//释放资源
break;
}
for(Iterator iter = clients.iterator();iter.hasNext();){
ThreadClient tc = (ThreadClient)iter.next();//将产生的线程放于容器中
tc.send(str);//信息发送回~~~~给客服端
}
System.out.println(str);
}
} catch (IOException e) {
e.printStackTrace();
this.close();
}
}
private void close() {
/*释放资源close();*/
try {
if(dis != null){
dis.close();
dis = null;
}
if(dos != null){
dos.close();
dos = null;
}
if(socket != null){
socket.close();
socket = null;
}
clients.remove(this);
} catch (IOException e) {
e.printStackTrace();
}
}
private void send(String str) {
/*通过send方法,将ThreadClient接收到的信息通过方法send(String str)方法socket发送回客服端*/
try {
dos.writeUTF("IP地址:"+socket.getInetAddress()+"端口号:"+socket.getPort()
+"--------"+"对大家说:"+str);
dos.flush();
} catch (IOException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args){
new chatServer().service();
}
}
- 聊天室初步代码(socket客户端和服务器端源代码)~
- linux socket 客户端和服务器端 基础框架代码
- 服务器端和客户端代码
- 聊天室服务器端软件源代码
- java Socket客户端和服务器端
- Android客户端和Java服务器端Socket代码连的坑(接空指针异常问题)
- C# Socket通信 客户端 服务器端代码
- Java Socket通信 客户端服务器端基本代码
- 初步认识windows socket服务器端与客户端编程
- 用Socket实现客户端和服务器端通信(完整版)
- java socket 客户端和服务器端互相通信(聊天)
- java socket 客户端和服务器端互相通信(聊天)
- Android 中socket编程(客户端和服务器端)
- 客户端和服务器端的通信(Socket编程)
- 小记最简单的socket服务器端和客户端的代码编写(C版和python版)
- 简单TCP服务器端和客户端(源代码)
- 简单UDP服务器端和客户端(源代码)
- 简单TCP服务器端和客户端(源代码)
- June six,2010,PM
- ResultSet is closed
- 大话设计模式学习(九)——外观模式
- 还是Windows Install Cleanup 威武
- 刷CSDN个人主页访问量
- 聊天室初步代码(socket客户端和服务器端源代码)~
- Rob Hess 的sift算法
- C#函数传参的out与ref的应用
- UCOS下邮箱使用 2010.6.6
- Spring bean 的继承与Java 中继承的区别
- Firefox extension开发实战
- java 使用javamail发送邮件
- C# ref与out区别
- jquery实现全选,反选,不选和提交按钮