JAVA(多线程+socket)的简易聊天室程序
需求:在用socket做服务端与客户端时,发现一个问题,当我们用whlie循环一次性在客户端或者服务端做一次性发送多条时,客户端或者服务端不能一次性全部接受,此时我们就要用到多线程。同时处理信息的接收与发送,两者互不干扰。
- 首先进行类的划分
- 在服务的接收类中继承Thread类重写run方法把要实现的方法写在run中
package com.feisi.test;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.Socket;
public class ThreadServerReceive extends Thread{
//用来接收启动类中的Socket对象
private Socket s=null;
public ThreadServerReceive(){
}
public ThreadServerReceive(Socket s){
//在构造方法中直接执行start方法,当程序创建对象时就
//保证线程的开启
this.s = s;
start();
}
@Override
public void run(){
//获取客户的消息
InputStream is = null;
//将文件以字节流转字符流的形式读取出来读取出来
BufferedReader br = null;
String str;
try {
while (true){
is = s.getInputStream();
br = new BufferedReader(
new InputStreamReader(is));
str = br.readLine();
System.out.println("来自客户端的消息----------"+str);
}
}catch (IOException e) {
e.printStackTrace();
}
}
}
- 在服务的发送类中继承Thread类重写run方法把要实现的方法写在run中
package com.feisi.test;
import java.io.*;
import java.net.Socket;
import java.util.Scanner;
public class ThreadServerSend extends Thread{
private Socket s=null;
public ThreadServerSend(){
}
public ThreadServerSend(Socket s){
this.s=s;
start();
}
@Override
public void run(){
OutputStream os=null;
try {
while(true){
System.out.println("请输入发送客户端的内容:");
Scanner sc = new Scanner(System.in);
String str=sc.nextLine();
os=s.getOutputStream();
PrintWriter pw = new PrintWriter(os, true);
pw.println(str);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
- 服务端的启动
package com.feisi.test;
import java.net.ServerSocket;
import java.net.Socket;
public class ThreadServerStart {
@SuppressWarnings("resource")
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
ServerSocket ss=null;
ss=new ServerSocket(9001);
while(true){
Socket s=ss.accept();
Thread r1=new ThreadServerSend(s);
Thread r2=new ThreadServerReceive(s);
}
}
}
- 在客户的接收类中继承Thread类重写run方法把要实现的方法写在run中
package com.feisi.test;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.Socket;
public class ThreadClietReceive extends Thread{
private Socket s=null;
public ThreadClietReceive(Socket s){
this.s=s;
start();
}
public void run() {
// TODO Auto-generated method stub
InputStream is=null;
BufferedReader br=null;
String str;
try {
while(true){
is=s.getInputStream();
br=new BufferedReader(
new InputStreamReader(is)
);
str = br.readLine();
System.out.println("来自服务端的消息--------"+str);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
- 在客户的发送类中继承Thread类重写run方法把要实现的方法写在run中
package com.feisi.test;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.Scanner;
public class ThreadClietsend extends Thread{
private Socket s=null;
public ThreadClietsend(){
}
public ThreadClietsend(Socket s){
this.s=s;
start();
}
@Override
public void run(){
OutputStream os=null;
BufferedWriter bw=null;
System.out.println("请输入发送服务端的内容:");
while(true){
try {
Scanner sc = new Scanner(System.in);
String str=sc.nextLine();
os=s.getOutputStream();
PrintWriter pw = new PrintWriter(os, true);
pw.println(str);
System.out.println("请输入发送服务端的内容:");
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
- 启动客户端
package com.feisi.test;
import java.net.Socket;
public class ThreadClietStart {
public static void main(String[] args) throws Exception{
Socket s=null;
s=new Socket("127.0.0.1",9001);
Thread r1=new ThreadClietReceive(s);
Thread r2=new ThreadClietsend(s);
}
}
这篇文章主要是解决客户端与服务端不能很好的自由发送信息的问题,利用线程很好的解决了这点,在多人聊天方面还要改进。结合io操作,一些文件的读写。要在先启动服务端的基础上再启动客户端,