服务器端
1、新建1个服务器类,3个属性
List:用来存储客户端发送的信息
ExecutorService :线程池用来建立和多个客户端的同步连接
ServerSocket :TCP连接
// An highlighted block
public class Server {
private static ServerSocket serversocket;
private static List<PrintWriter> list;
private static ExecutorService threadpool;
public Server(){
try {
list=new ArrayList<PrintWriter>();
threadpool=Executors.newFixedThreadPool(50);
serversocket=new ServerSocket(8088);
} catch (Exception e) {
e.printStackTrace();
}
}
public static ServerSocket getServersocket() {
return serversocket;
}
public static void setServersocket(ServerSocket serversocket) {
Server.serversocket = serversocket;
}
public static List<PrintWriter> getList() {
return list;
}
public static void setList(List<PrintWriter> list) {
Server.list = list;
}
public static ExecutorService getThreadpool() {
return threadpool;
}
public static void setThreadpool(ExecutorService threadpool) {
Server.threadpool = threadpool;
}
}
2、写个start方法,用来建立连接,和客户端交互
// An highlighted block
public void ServerStart(){
try {
//循环与客户端交互
System.out.println("客户端正在连接。。。。");
while(true){
Socket socket=serversocket.accept();//客户端连接
System.out.println("客户端连接成功");
//启动线程池,与客户端交互
ClientHander hander=new ClientHander(socket);
threadpool.execute(hander);
}
} catch (Exception e) {
e.printStackTrace();
}
}
static class ClientHander implements Runnable{
private Socket socket;
public ClientHander(Socket socket){
this.socket=socket;
}
@Override
public void run() {
PrintWriter pw = null;
try {
//将发送给客户端的输出流存入集合
OutputStream os=socket.getOutputStream();
OutputStreamWriter osw=new OutputStreamWriter(os,"UTF-8");
pw= new PrintWriter(osw,true);
addOut(pw);
//从客户端读入输入流
InputStream is=socket.getInputStream();
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
String message = null;
while((message = br.readLine())!=null){
sendmessage(message);
}
} catch (IOException e) {
e.printStackTrace();
}
finally{
removeOut(pw);
if(socket!=null){
try{
socket.close();
}catch(IOException e){
e.getStackTrace();
}
}
}
}
}
3、/定义添加、删除、发送信息方法
// An highlighted block
public synchronized static void addOut(PrintWriter out){
list.add(out);
}
public synchronized static void removeOut(PrintWriter out){
list.remove(out);
}
public synchronized static void sendmessage(String message){
for(PrintWriter p : list){
p.println(message);
}
}
4、最后main方法,构造一个服务器类,然后执行类方法
// An highlighted block
public static void main(String[] args) {
Server server=new Server();
server.ServerStart();
}
服务器端完整代码
// An highlighted block
package test.testsocket;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class Server {
private static ServerSocket serversocket;
private static List<PrintWriter> list;
private static ExecutorService threadpool;
public Server(){
try {
list=new ArrayList<PrintWriter>();
threadpool=Executors.newFixedThreadPool(50);
serversocket=new ServerSocket(8088);
} catch (Exception e) {
e.printStackTrace();
}
}
public static ServerSocket getServersocket() {
return serversocket;
}
public static void setServersocket(ServerSocket serversocket) {
Server.serversocket = serversocket;
}
public static List<PrintWriter> getList() {
return list;
}
public static void setList(List<PrintWriter> list) {
Server.list = list;
}
public static ExecutorService getThreadpool() {
return threadpool;
}
public static void setThreadpool(ExecutorService threadpool) {
Server.threadpool = threadpool;
}
public void ServerStart(){
try {
//循环与客户端交互
System.out.println("客户端正在连接。。。。");
while(true){
Socket socket=serversocket.accept();//客户端连接
System.out.println("客户端连接成功");
//启动线程池,与客户端交互
ClientHander hander=new ClientHander(socket);
threadpool.execute(hander);
}
} catch (Exception e) {
e.printStackTrace();
}
}
static class ClientHander implements Runnable{
private Socket socket;
public ClientHander(Socket socket){
this.socket=socket;
}
@Override
public void run() {
PrintWriter pw = null;
try {
//将发送给客户端的输出流存入集合
OutputStream os=socket.getOutputStream();
OutputStreamWriter osw=new OutputStreamWriter(os,"UTF-8");
pw= new PrintWriter(osw,true);
addOut(pw);
//从客户端读入输入流
InputStream is=socket.getInputStream();
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
String message = null;
while((message = br.readLine())!=null){
sendmessage(message);
}
} catch (IOException e) {
e.printStackTrace();
}
finally{
removeOut(pw);
if(socket!=null){
try{
socket.close();
}catch(IOException e){
e.getStackTrace();
}
}
}
}
}
//定义添加、删除、发送信息方法
public synchronized static void addOut(PrintWriter out){
list.add(out);
}
public synchronized static void removeOut(PrintWriter out){
list.remove(out);
}
public synchronized static void sendmessage(String message){
for(PrintWriter p : list){
p.println(message);
}
}
public static void main(String[] args) {
Server server=new Server();
server.ServerStart();
}
}
客户端
// An highlighted block
package test.testsocket;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.Scanner;
public class Client {
private static Socket socket;
public static void main(String[] args){
Client client=new Client();
client.start();
}
public Client() {
try {
//建立和服务器的连接
socket =new Socket("localhost",8088);
} catch (Exception e) {
e.printStackTrace();
}
}
public void start(){
try {
ServerHander hander=new ServerHander();
Thread t=new Thread(hander);
t.setDaemon(true);
t.start();
//发送信息至服务端
OutputStream os=socket.getOutputStream();
OutputStreamWriter osw=new OutputStreamWriter(os,"UTF-8");
PrintWriter pw=new PrintWriter(osw,true);
Scanner s=new Scanner(System.in);
while(true){
pw.println(s.nextLine());
}
} catch (Exception e) {
e.printStackTrace();
}
finally{
if(socket!=null){
try{
socket.close();
}catch(IOException e){
e.getStackTrace();
}
}
}
}
static class ServerHander implements Runnable{
@Override
public void run() {
try {
//接受服务端发送的信息
InputStream is=socket.getInputStream();
InputStreamReader isr=new InputStreamReader(is,"UTF-8");
BufferedReader br=new BufferedReader(isr);
while(true){
System.out.println(br.readLine());
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}