一个简单的聊天程序,多个客户端连接服务器进行讨论组聊天,发送"exit"结束连接并退出客户端。在eclipse下运行需要调出多个console,OpenConsole——New Console View调出新的控制台,控制台的位置可能和原来的位置不一样,选择detach,Display Selected Console选择对应的运行程序,点击Pin Console 这样就能同时有两个程序的控制台。
package TcpTest;
import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.HashSet;
public class Server {
public static void main(String[] args) throws IOException {
ServerSocket so=new ServerSocket(6666);
Socket ss=null;
Thread sender=new Thread(new ServerSender());
sender.start();
while(true){
ss=so.accept();
if(ss!=null){
ServerSender.add(ss);
Thread thread=new Thread(new ServerReceiver(ss));
thread.start();
}
}
}
}
class ServerReceiver implements Runnable{
Socket ss;
public ServerReceiver(Socket ss){
this.ss=ss;
}
@Override
public void run() {
String s=null;
boolean flag=true;
DataInputStream dataIn=null;
try {
dataIn=new DataInputStream(ss.getInputStream());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
while(flag){
try {
s=dataIn.readUTF();
if(s!=null){
System.out.println(ss.getInetAddress()+":"+s);
ServerSender.remove(ss);
ServerSender.sendmessage(ss.getInetAddress()+":"+s);
ServerSender.add(ss);
}
if(s.equals("exit")){
ss.close();
ServerSender.remove(ss);
dataIn.close();
flag=false;
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
class ServerSender implements Runnable{
public static HashSet<Socket> set=new HashSet<Socket>();
public static void add(Socket so){
set.add(so);
}
public static void remove(Socket so){
set.remove(so);
}
@Override
public void run() {
InputStreamReader iReader=new InputStreamReader(System.in);
BufferedReader bReader=new BufferedReader(iReader);
DataOutputStream dOut=null;
String s=null;
while(true){
try {
s=bReader.readLine();
if(s!=null&&set!=null){
for(Socket socket:set){
dOut=new DataOutputStream(socket.getOutputStream());
dOut.writeUTF("host:"+s);
}
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public static void sendmessage(String s){
DataOutputStream dOut=null;
for(Socket socket:set){
try {
dOut=new DataOutputStream(socket.getOutputStream());
dOut.writeUTF(s);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
package TcpTest;
import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;
import java.net.UnknownHostException;
public class Cient {
public static void main(String[] args) throws UnknownHostException, IOException{
Socket so=new Socket("127.0.0.1",6666);
Thread receive=new Thread(new Receivers(so));
Thread sender=new Thread(new Sender(so));
sender.start();
receive.start();
}
}
class Sender implements Runnable{
Socket so;
public Sender(Socket so){
this.so=so;
}
@Override
public void run() {
InputStreamReader iReader=new InputStreamReader(System.in);
BufferedReader bReader=new BufferedReader(iReader);
DataOutputStream dOut=null;
try {
dOut=new DataOutputStream(so.getOutputStream());
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
String s=null;
while(true){
try {
s=bReader.readLine();
if(s!=null){
dOut.writeUTF(s);
}
if(s.equals("exit")){
so.close();
dOut.close();
System.exit(0);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
class Receivers implements Runnable{
Socket so;
public Receivers(Socket so){
this.so=so;
}
@Override
public void run() {
DataInputStream din=null;
String s=null;
while(true){
try {
din=new DataInputStream(so.getInputStream());
s=din.readUTF();
if(s!=null){
System.out.println(s);
}
} catch (IOException e) {
if(so.isClosed()){
System.out.println("退出聊天");
System.exit(0);
}else e.printStackTrace();
}
}
}
}