运用socket、多线程、IO流等技术。实现了一个客户端发送信息,其余客户端及服务器可接受信息;服务端发送信息,所有客户端接受信息的功能。
服务端类:
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class ServerDemo1 {
ServerSocket ss = null;
Socket s = null;
static List<Socket> users = new ArrayList<Socket>();//定义集合存放client对象
int count = 0;//用于client计数
public static void main(String[] args) {
new ServerDemo1();
}
public ServerDemo1() {
System.out.println("========服务端========");
try {
ss = new ServerSocket(8493);//服务器注册端口号
while(true){
s = ss.accept();//获取连接过来的客户端对象。阻塞式的。
users.add(s);
System.out.println(++count+" client connected to server……");
new Write(s).start();
new Read(s).start();
}
} catch (IOException e) {
e.printStackTrace();
}finally{
}
}
public void exit(){
try {
s.close();
System.out.println("===服务端已停止===");
System.exit(0);
} catch (IOException e) {
e.printStackTrace();
}
}
//==========读的线程内部类============
class Read extends Thread{
Socket s;
InputStream is;
public Read(Socket s) {
try {
this.s = s;
this.is = s.getInputStream();
} catch (IOException e) {
e.printStackTrace();
}
}
//将读入的信息发送到除此次接收到的client以外的所有client中去
public void sendOthers(String msg) {
for(Socket temp:users) {
if(temp != s) {
try {
temp.getOutputStream().write(msg.getBytes());
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
public void run(){
byte[] buf = new byte[1024];
int len = 0;
try {
while((len = is.read(buf)) != -1){
String msg = new String(buf,0,len);
sendOthers(msg);
System.out.println(msg);
}
} catch (IOException e) {
System.out.println(count+"client has been quit");
users.remove(s);
}
}
}
//==========写的线程内部类============
class Write extends Thread{
Scanner scan = new Scanner(System.in);
Socket s;
OutputStream os;
public Write(Socket s) {
try {
this.s = s;
this.os = s.getOutputStream();
} catch (IOException e) {
e.printStackTrace();
}
}
//将服务端的信息发送到所有的客户端中去
public void sendOthers(String send) {
for(Socket temp:users) {
try {
temp.getOutputStream().write(send.getBytes());
} catch (IOException e) {
e.printStackTrace();
}
}
}
public void run(){
while(true){
String send = scan.nextLine();
sendOthers(send);
if("bye".equals(send))
exit();
}
}
}
}
客户端类:
package com.imcore.cn.Tcp;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.*;
import java.util.Scanner;
public class ClientDemo1 {
Scanner scan = new Scanner(System.in);
Socket s = null;
public static void main(String[] args) {
new ClientDemo1();
}
public ClientDemo1() {
try {
s = new Socket("127.0.0.1",8493);
System.out.println("========客户========");
new Write(s).start();
new Read(s).start();
} catch (IOException e) {
e.printStackTrace();
}finally{
}
}
//结束程序方法exit()
public void exit(){
try {
s.close();
System.out.println("===客户端已停止===");
System.exit(0);
} catch (IOException e) {
e.printStackTrace();
}
}
//==========读的线程内部类============
class Read extends Thread{
Socket s;
InputStream is;
public Read(Socket s) {
try {
this.is = s.getInputStream();
} catch (IOException e) {
e.printStackTrace();
}
}
public void run(){
byte[] buf = new byte[1024];
int len = 0;
try {
while((len = is.read(buf)) != -1){
String msg = new String(buf,0,len);
System.out.println(msg);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
//==========写的线程内部类============
class Write extends Thread{
Socket s;
OutputStream os;
public Write(Socket s) {
try {
this.os = s.getOutputStream();
} catch (IOException e) {
e.printStackTrace();
}
}
public void run(){
while(true){
String send = scan.nextLine();
try {
os.write(send.getBytes());
} catch (IOException e) {
e.printStackTrace();
}
if("bye".equals(send))
exit();
}
}
}
}