今天星期五,参加培训的第三十六天,一如往常,最近看的是数据库,了解了一些东西,但是好像也没有什么,反正就是函数什么的,还有什么语句对数据操作什么的,也没有什么好说的,今天遇到了问题,就是客户端和服务器端通信的时候,总是出现等待的,情况,好像和定义的方式也有点关系。
如下代码:
objectToServer = new ObjectOutputStream(socket.getOutputStream());
objectFromServer = new ObjectInputStream(socket.getInputStream());
应该是不要把in赋值在out之前,应该是这样的,可能会出现一个数据也读不完的问题,然后最重要的是,以下代码:
objectToServer.writeUTF(option);
objectToServer.flush();
objectToServer.writeUTF(account);
objectToServer.flush();
Object object = objectFromServer.readObject();
写一个write就要加一个flush,要不然会有一直等待输入的情况。至于其它的什么,也没有什么好说的了,贴一下自己写的渣渣代码吧。
package client;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.EOFException;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;
import javax.management.ObjectInstance;
import client.RegisterControl.HandleClient;
import dao.UserDao;
import dao.UserUserDao;
import entity.User;
public class MainControl {
private ServerSocket serverSocket;
DataInputStream inputFromClient;
DataOutputStream outputToClient;
ObjectInputStream objectFromClient;
ObjectOutputStream objectToClient;
UserDao userDao = new UserDao();
UserUserDao userUserDao = new UserUserDao();
public MainControl() {
// TODO Auto-generated constructor stub
try {
serverSocket = new ServerSocket(7000);
while (true) {
Socket socket = serverSocket.accept();
HandleClient MainTask = new HandleClient(socket);
new Thread(MainTask).start();
}
// inputFromClient= new DataInputStream(socket.getInputStream());
// outputToClient = new DataOutputStream(socket.getOutputStream());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
class HandleClient implements Runnable {
private Socket socket;
public HandleClient(Socket socket) {
// TODO Auto-generated constructor stub
this.socket = socket;
}
@Override
public synchronized void run() {
// TODO Auto-generated method stub
try {
// inputFromClient = new DataInputStream(socket.getInputStream());
// outputToClient = new DataOutputStream(socket.getOutputStream());
objectToClient = new ObjectOutputStream(socket.getOutputStream());
objectFromClient = new ObjectInputStream(socket.getInputStream());
while (true) {
try {
String option = objectFromClient.readUTF();
System.out.println(option);
if (option.equals("getUser")) {
// String code=SmsDemo.sendSms(str.substring(4));
System.out.println("aaa");
String account = objectFromClient.readUTF();
User user = userDao.getUserByAccount(account);
objectToClient.writeObject(user);
objectToClient.flush();
objectToClient.flush();
continue;
}
// System.out.println("bbb");
if (option.equals("getUserList")) {
String account = objectFromClient.readUTF();
System.out.println(account);
List<User> userList = userDao.getAllFriend(account);
// System.out.println(userList.size()+"----------");
objectToClient.writeObject(userList);
objectToClient.flush();
objectToClient.flush();
continue;
}
if(option.equals("isFriendExists")) {
String account1=objectFromClient.readUTF();
String account2=objectFromClient.readUTF();
objectToClient.writeBoolean(userUserDao.isFriendExists(account1, account2));
objectToClient.flush();
objectToClient.flush();
}
if(option.equals("addFriend")) {
String account1 = objectFromClient.readUTF();
String account2 = objectFromClient.readUTF();
objectToClient.writeBoolean(userUserDao.addFriend(account1, account2));
objectToClient.flush();
}
} catch (EOFException e) {
break;
}
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// catch (ClientException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// }
}
}
public static void main(String[] args) {
MainControl mainControl = new MainControl();
}
}
以下代码是解决,两个死循环方法一起运行的方案:
package client;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class ServerControl {
public static void main(String[] args) {
ExecutorService executor = Executors.newCachedThreadPool();
executor.execute(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
RegisterControl registerControl = new RegisterControl();
}
});
executor.execute(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
MainControl mainControl = new MainControl();
}
});
}
}
然后就没有什么,毕竟今天被那个破问题烦死了,好的,结束。