读书人

关于Socket编程里面的有关问题

发布时间: 2013-08-09 15:16:24 作者: rapoo

关于Socket编程里面的问题
在Socket编程中,我再服务端写了如下代码


while (true) {
int port = Integer.parseInt(textField.getText());
try {
ServerSocket serverSocket = new ServerSocket(port);
Socket sk = serverSocket.accept();
BufferedReader bReader = new BufferedReader(
new InputStreamReader(sk.getInputStream()));
textArea.setText(bReader.readLine());
serverSocket.close();
bReader.close();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}

这个方法是监听一个button按钮的,这个按钮的功能就是打开一个服务端口。我用了一个while(true),虽然是死循环,但是这样子为什么程序就不能运行呀?我知道这个可以用线程来解决,但是我觉得我自己这样写也没有错啊?至少程序可以运行吧。但是现在的问题是程序居然不能运行了,ServerSocket serverSocket = new ServerSocket(port);当运行到这句的时候,程序应该会停下来,发生阻塞。监听客户端的信息!所以这个循环式成立的呀?为什么不能执行?
[解决办法]
引用:
Quote: 引用:

 serverSocket.close();

你把ServerSocket都关闭,肯定无法监听了。

不是运行完了再关闭的吗?额。。。然后在关闭,然后再一次执行循环体里面的语句,这个时候会new一个新的对象出来的诶!


这样每次循环都是一个新的Server吧,把创建Serversocket的代码移到while循环外面,每次关闭socket就可以了,这个都是同一个Serversocket在处理,如果多个客户端请求就会出现阻塞的情况了。
[解决办法]
楼主服务器端ServerSocket应该一直监听,有客户端连接就new 新线程,关闭的是这个线程,而不是主线程中ServerSocket,给你例子。
package conn;

import java.io.*;
import java.net.*;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

/*对象反串行化,与客户端定义一样*/
class Customer extends Object implements java.io.Serializable //封装登录信息
{
String custName; //用户名
String custPassword; //密码
}

class ChaXun extends Object implements java.io.Serializable //封装查询信息
{
String neirong; // 用户ID或用户姓名
}

class Exit extends Object implements java.io.Serializable //封装退出信息


{
String custName; //退出
}

/*对象串行化,与客户端定义一样*/
class Message extends Object implements java.io.Serializable //封装通讯录信息
{
String ID; //用户ID
String name; //用户姓名
String address; //单位地址
String mobilephone; //手机号码
String telephone; //单位电话
String homephone; //家庭电话
}

public class Server{
ServerSocket server;
Socket socket;
Thread thread;
PrintStream ToClient;
public Server() {
try {
server = new ServerSocket(2000);
System.out.println("等待与客户端连接...");
while (true) {
socket = server.accept(); // 侦听连接请求,等待连接
new Connect(socket);
}


} catch (Exception e) {
System.out.println("不能启动服务");
}
}

public static void main(String[] args) { //main方法
new Server();

}

}

class Connect extends Thread{
ObjectInputStream FromClient; // 从客户端到服务器
PrintStream ToClient;
Socket Client;
Object obj; // 定义根类对象
String user[] = new String[2]; // 2个字符串空间用于存放登录时查询数据库所得的用户信息(用户名和密码)
Message message = new Message(); // 创建Message对象,用于封装查询通讯录中一个用户的全部信息
Exit exit = new Exit(); // 用户退出请求

public Connect(Socket Client) {
this.Client = Client;
try {
FromClient = new ObjectInputStream(this.Client.getInputStream()); // 检索客户端输入
ToClient = new PrintStream(this.Client.getOutputStream()); // 服务器写回客户端
} catch (IOException e) {
try {
this.Client.close();// 关闭套接字连接
} catch (IOException e1) {
e1.printStackTrace();
}
System.out.println("1输入输出流异常!");
}
this.start();// 启动线程
}

public void run() {
try {
obj = (Object) FromClient.readObject();
int none = 0;// 用于判断用户是否存,0不存在
/* 暂时不考虑重复登录 */
if (obj.getClass().getName().equals("Customer")) { // 客户端登录时


Customer customer = (Customer) obj;
loginsql(user, customer); // 登录时数据库操作
if (user[0].equals(customer.custName)) {
none = 1;
if (!user[1].equals(customer.custPassword))
{
ToClient.println("密码错误,请重新输入!");
}
else
{
System.out.println("用户"+customer.custName+"登录成功!");
ToClient.println("登录成功!");

}

}
else if (none == 0)
{
ToClient.println("用户不存在!");
}

}
if (obj.getClass().getName().equals("ChaXun")) { // 客户端查询通信录时
ChaXun chaxun = (ChaXun) obj;
addressbooksql(message, chaxun); // 查询通讯录数据库操作
if (message.name.equals(chaxun.neirong)
[解决办法]
message.ID.equals(chaxun.neirong))//查询成功
{

ObjectOutputStream streamToServer=new ObjectOutputStream(Client.getOutputStream());//信息发往客户端
streamToServer.writeObject((Message)message);
}
else //查询失败
{
ObjectOutputStream streamToServer=new ObjectOutputStream(Client.getOutputStream());//信息发往客户端
streamToServer.writeObject((Message)message);//此时Message各成员变量都为初始化的值
}

}
if (obj.getClass().getName().equals("Exit")) { // 客户端退出时

Exit exit = (Exit) obj;
System.out.println("用户"+exit.custName + "退出!");

}
} catch (IOException e1) {
e1.printStackTrace();
System.out.println("3输入输出流异常!");
} catch (ClassNotFoundException e2) {
System.out.println("读对象异常!");
} finally {
try {
Client.close(); // 关闭套接字连接
} catch (IOException e) {
e.printStackTrace();
System.out.println("4输入输出流异常!");
}
}

}

读书人网 >J2SE开发

热点推荐