62,614
社区成员
发帖
与我相关
我的任务
分享
import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import qq.domain.Messages;
import qq.domain.User;
public class ServerChat implements Runnable{
private static final String DATABASE_PATH = "";
private ServerSocket ss = null;
private boolean isStarted = false;
private static ArrayList<User> users = new ArrayList<User>();
private ArrayList<Client> clients = new ArrayList<Client>();
@Override
public void run() {
this.startServer();
System.out.println("服务器停止了!!!!!!!!!!!!!");
}
public void startServer(){
System.out.println("服务器启动了!!!!!!!!!!!!!!");
try {
ss = new ServerSocket(8888);
this.isStarted = true;
//users = new DBUser().getUsersFromDB();
} catch (IOException e) {
e.printStackTrace();
}
while(isStarted) {
try {
Socket socket = ss.accept();
System.out.println("有个客户端连接上来了");
Client client = new Client(socket);
System.out.println("服务器端启动一个Client对话");
new Thread(client).start();
clients.add(client);
} catch (IOException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
ServerChat server = new ServerChat();
server.startServer();
}
class Client implements Runnable{
private Socket socket = null;
private boolean isConnection = false;
private InputStream input = null;
private OutputStream output = null;
private ObjectInputStream dis = null;
private ObjectOutputStream dos = null;
private Messages message = null;
public Client(Socket socket) {
this.socket = socket;
isConnection = true;
try {
input = this.socket.getInputStream();
output = this.socket.getOutputStream();
} catch (IOException e) {
e.printStackTrace();
}
}
public void send(Messages message) {
try {
dos.writeObject(message);
dos.flush();
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void run() {
try {
//这里阻塞了,如何解决
dis = new ObjectInputStream(input);
dos = new ObjectOutputStream(output);
while(isConnection) {
try {
System.out.println("服务器,将要读一次消息");
message = (Messages) dis.readObject();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
System.out.println("服务器端收到:" +message.getMessage());
this.send(message);
}
} catch (IOException e) {
System.out.println("客户端连接已经中断");
} finally {
try {
if(dis != null) {
dis.close();
}
if(dos != null) {
dos.close();
}
if(socket != null){
socket.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.Socket;
import java.util.Scanner;
import qq.domain.Messages;
public class ClientChat {
private Socket socket = null;
private ObjectInputStream dis = null;
private ObjectOutputStream dos = null;
private Messages message = null;
private boolean isConnection = false;
public ClientChat() {
}
public void connect() {
try {
this.socket = new Socket("爷的PC",8888);
dis = new ObjectInputStream(socket.getInputStream());
dos = new ObjectOutputStream(socket.getOutputStream());
isConnection = true;
new Thread(new receiveThread()).start();
} catch (IOException e) {
e.printStackTrace();
}
}
public void disConnect() {
try {
if(dis != null) {
dis.close();
}
if(dos != null) {
dos.close();
}
if(socket != null) {
socket.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
public void send() {
Scanner scan = new Scanner(System.in);
String messageString = null;
try {
while(isConnection) {
messageString = scan.next();
message.setMessage(messageString);
dos.writeObject(message);
}
} catch (IOException e) {
e.printStackTrace();
}
}
private class receiveThread implements Runnable {
private Messages receiveMessage = null;
@Override
public void run() {
try {
while(isConnection) {
try {
receiveMessage = (Messages) dis.readObject();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
System.out.println("客户端收到:"+message.getMessage());
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
ClientChat client = new ClientChat();
client.connect();
client.send();
}
}
public class Messages {
private User fromUser = null;
private User toUser = null;
private String message = null;
private Image image = null;
private Icon icon = null;
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public Image getImage() {
return image;
}
public void setImage(Image image) {
this.image = image;
}
public Icon getIcon() {
return icon;
}
public void setIcon(Icon icon) {
this.icon = icon;
}
public User getFromUser() {
return fromUser;
}
public void setFromUser(User fromUser) {
this.fromUser = fromUser;
}
public User getToUser() {
return toUser;
}
public void setToUser(User toUser) {
this.toUser = toUser;
}
}
class Receiver implements Runnable {
ObjectInputStream read ;
public void run () throws .... {
read = new ObjectInputStream(socket.getInputStream());
while(true){
String message = ((String)read.readObject()).getMessage();
//收到消息
}
}
}
//伪代码
class Receiver implements Runnable {
BufferedReader read ;=
public void run () throws .... {
read = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String message = null;
while((message=read.readLine())!=null){ //这种循环只有当客户端和服务器断开时才停止,没消息时一直阻塞
//收到消息并显示在对话框
}
}
}
protected class Worker {
protected Socket socket = null;
protected DataInputStream dataIn;
protected DataOutputStream dataOut;
protected boolean closed = false;
public Worker(Socket socket) {
this.socket = socket;
try {
socket.setTcpNoDelay(true);
socket.setKeepAlive(false);
}
catch (SocketException e) {
logger.error("Failed to set Socket properties: " + e.getMessage(), e);
}
}
public void dispose() {
closed = true;
try {
if (socket != null && !socket.isClosed()) {
if (logger.isDebugEnabled()) {
// some dirty workaround for IBM JSSE's SSL implementation,
// which closes sockets asynchronously by that point.
final SocketAddress socketAddress = socket.getLocalSocketAddress();
if (socketAddress == null) {
logger.debug("Listener has already been closed by other process.");
} else {
logger.debug("Closing listener: " + socketAddress);
}
}
socket.close();
}
}
catch (IOException e) {
logger.warn("Socket close failed with: " + e);
}
}
/**
* Accept requests from a given TCP port
*/
public void run() {
try {
dataIn = new DataInputStream(new BufferedInputStream(socket.getInputStream()));
dataOut = new DataOutputStream(new BufferedOutputStream(socket.getOutputStream()));
while (!socket.isClosed()) {
try {
Object readMsg = protocol.read(dataIn);
if (readMsg == null) {
break;
}
Object result = processData(readMsg);
if (result != null) {
protocol.write(dataOut, (byte[])result);
}
//protocol.write(dataOut, (byte[])readMsg);
//dataOut.write((byte[])readMsg);
dataOut.flush();
}
catch (SocketTimeoutException e) {
if (!socket.getKeepAlive()) {
break;
}
}
}
}
catch (Exception e) {
handleException(e);
}
finally {
dispose();
}
}
protected Object processData(Object data) throws Exception {
return d.doSend((byte[])data);
}
}