自己写了这个程序,主要是理解socket、io、多线程。
下面是程序具体代码:
服务器类代码如下:
package com.lizhenfa.socket;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
private ServerSocket serverSocket;
public Server(){
}
/**
* 初始化
*/
public void init(){
try {
serverSocket = new ServerSocket(10000);
System.out.println("服务器启动了");
//时刻监听客户端
while(true){
Socket socket = serverSocket.accept();
//当有客户端连接服务器,建立连接,创建通信线程,并启动
new CommunicateServer(socket).start();
}
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String args[]){
new Server().init();
}
}
服务器端负责和客户端联系的类代码如下:
package com.lizhenfa.socket;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
public class CommunicateServer extends Thread{
//连接对象
private Socket socket;
//输入流
BufferedReader in;
//输出流
PrintWriter out;
public CommunicateServer(Socket socket){
this.socket = socket;
try {
in = new BufferedReader(new InputStreamReader(this.socket.getInputStream()));
out = new PrintWriter(this.socket.getOutputStream());
} catch (IOException e) {
e.printStackTrace();
}
}
public void run(){
try {
boolean isgoon = true;
while(isgoon){
//如果得到字符串不为空 且 不是“quit”,则将字符串返回客户端
String message = in.readLine();
System.out.println("客户端的消息是:"+ message);
if(message != null && "quit".equals(message)){
isgoon = false;
}
//发送消息
sendMessage(message);
}
//关闭连接
close();
} catch (IOException e) {
e.printStackTrace();
}
}
/*
* 关闭连接
*/
public void close(){
try {
//关闭连接
this.socket.close();
System.out.println("服务端关闭连接");
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 发送消息
* @param message 消息内容
*/
public void sendMessage(String message){
out.println(message);
out.flush();
}
}
客户端代码如下:
package com.lizhenfa.socket;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;
public class Client extends Thread{
//输入流
private BufferedReader in ;
//输出流
private PrintWriter out;
//连接对象
private Socket socket;
public Client(){
init();
}
public void init(){
try {
//请求连接
socket = new Socket(InetAddress.getLocalHost(),10000);
System.out.println("客户端连接上服务器了");
//得到输入流
in = new BufferedReader(new InputStreamReader(this.socket.getInputStream()));
//得到输出流
out = new PrintWriter(this.socket.getOutputStream());
} catch (UnknownHostException e) {
} catch (IOException e) {
System.out.println("服务器没启动");
}
}
public void run(){
if(socket != null){
boolean isgoon = true;
while(isgoon){
System.out.println("请输入内容:");
Scanner console = new Scanner(System.in);
String message = console.next();
//发送消息到服务器
sendMessage(message);
//接受服务器的消息
isgoon = recieveMessage();
}
//关闭连接
close();
}
}
public void sendMessage(String s){
out.println(s);
out.flush();
}
public boolean recieveMessage(){
try {
//得到消息
String message = in.readLine();
//输出服务器过来的消息
System.out.println("服务器过来的消息是:" + message);
if("quit".equals(message)){
return false;
}
} catch (IOException e) {
e.printStackTrace();
}
return true;
}
public void close(){
try {
this.socket.close();
System.out.println("客户端关闭连接");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static void main(String args[]){
new Client().start();
}
}