当前位置:编程学习 > JAVA >>

Socket 多线程 实现注册的问题,求指导。。。

问题描述:

客户端输入  用户代码,产品代码  发送给 服务端,服务端验证 用户代码与产品代码,然后服务端生成一个注册码,发送到客户端。



图画的丑了点,请见谅啊  - -|||



这里有个多线程的问题我不太清楚怎么解决,server用一个线程进行接收client的数据,server的另外一个线程用于发送数据给client 当多个客户同时访问服务端时,要考虑互斥性。。 

我是小白,刚学JAVA不久。。这个问题可能也描述也不太清楚和准确,如果不能一个线程用于接收,一个用于发送,只要能实现 多个客户能同时访问服务端就可以了,可以每个用户一个线程,不过据说用户多了服务器会卡死。。。。

昨天才学完多线程。。所以不知道怎么解决这个问题,请各位高手多多指教,谢谢。。 --------------------编程问答-------------------- 好好重构一下吧,给你点思路
SeverSocket ss = new SeverSocket(8888);
while(true){
Socket s = ss.accept();
ClientThread ct = new ClientThread(s);
new Thread(ct).start;
}
class ClientThread implements Runnable{
Socket s;
ClientThread(Socket s){
this.s = s;
}
//To DO your personal Logic
//在这里实现你的收发,算同时吧?
}
--------------------编程问答-------------------- --------------------编程问答-------------------- TestClient.java

import java.net.*;
import java.io.*;
import java.util.*;
public class TestClient {

public static void main(String[] args) throws Exception {
while(true){
Scanner ins = new Scanner(System.in);
Socket s  = new Socket("10.33.0.9",8889);// 创建一个流套接字并将其连接到指定主机上的指定端口号。

//客户端的Socket端口要与服务器端的相同
DataOutputStream  out = new DataOutputStream(s.getOutputStream());

System.out.print("请输入:");
String str = ins.next();
while(!str.equals("byebye"))
out.writeUTF(str); //写出去的管道

DataInputStream  in = new DataInputStream(s.getInputStream());
System.out.println(in.readUTF());
out.close();
in.close();
s.close();
}

}
} --------------------编程问答-------------------- TestServer.java

import java.net.*;
import java.io.*;
import java.util.*;
public class TestServer {

public static void main(String[] args) throws Exception {
String str ;
while(true){
ServerSocket s  = new ServerSocket(8889);// 创建绑定到特定端口的服务器套接字。
Scanner ins = new Scanner(System.in);
Socket ss = s.accept();
DataInputStream in = new DataInputStream(ss.getInputStream());
System.out.println(in.readUTF());


DataOutputStream out = new DataOutputStream(ss.getOutputStream());//写出管道
System.out.print("请输入:");
str = ins.next();
if(str != null)
out.writeUTF(str) ;//写出去
//in = new DataInputStream(ss.getInputStream());//写入管道
System.out.println(in.readUTF());
in.close();
out.close();
s.close();
ss.close();
}


}
} --------------------编程问答--------------------
引用 1 楼  的回复:
好好重构一下吧,给你点思路

Java code
SeverSocket ss = new SeverSocket(8888);
while(true){
Socket s = ss.accept();
ClientThread ct = new ClientThread(s);
new Thread(ct).start;
}
class ClientThread impleme……





谢谢指点,根据你的提示我已经写出可以多个用户同时访问服务端了。
还想请教一下。。如果我想用两个线程来处理这个问题,一个线程用于专门接收数据,一个线程用于专门返回数据,应该怎么做呢,锁怎么加呢。。。异步索这个问题困扰我好久了。
想了下用 vector  ,先连接的用户写入 vector 中,一个用户处理完了再提取第二个用户。不知道这样对不对。。但是我不知道程序具体应该怎么写出来。。。

能不能再指点一下下。。



import java.io.*;
import java.net.*;

public class Server {
public static int subThreadNum; //记录线程数量
public static void main(String[] args) throws Exception {
ServerSocket ss = new ServerSocket(8888);
System.out.println("Listening Port 8888....");
while(true){
Socket s = ss.accept();
subThreadNum ++;
ClientThread ct = new ClientThread(s);
new Thread(ct).start();
System.out.println("有新线程启动,现在总线程数为:" + subThreadNum);
}
}
}


class ClientThread implements Runnable{
Socket s;
ClientThread(Socket s){
this.s = s;
}

public void run() {
try {
String userCode,productKey,machineKey,productActivationCode,computerName;
int licenseNumber;

//建立socket的输入输出流
DataInputStream dis = new DataInputStream(s.getInputStream());
DataOutputStream dos = new DataOutputStream(s.getOutputStream());

//建立文件的输入输出流
PrintWriter pw = new PrintWriter("d:/data/info.txt");


//读取用户代码、产品代码
userCode = dis.readUTF();
productKey = dis.readUTF();

//在Server端输出用户信息
System.out.println(Server.subThreadNum + "号线程用户的数据为:");
System.out.println(productKey);
System.out.println(userCode);

//将信息输出到文件保存
pw.println(userCode);
pw.println(productKey);


if(userCode.equals("userCode:001") && productKey.equals("productKey:abcd")) {
dos.writeUTF("验证成功!你的激活码为: 001AAABBBCCC");
} else {
dos.writeUTF("验证失败!请输入正确的<用户代码>与<产品代码>");
}


//关闭各种流
pw.close();
dos.close();
dis.close();
s.close();


Server.subThreadNum--;   //线程退出后,减少线程总数量

} catch(Exception e) {
e.printStackTrace();
}
}
}


--------------------编程问答--------------------


import java.net.*;
import java.util.Scanner;
import java.io.*;

public class Client {
public static void main(String[] args) throws Exception {

String userCode,productKey,machineKey,productActivationCode,computerName;
int licenseNumber;
Socket s = new Socket("localhost",8888);  

//建立输入输入输出流,扫描器
DataOutputStream dos = new DataOutputStream(s.getOutputStream());
DataInputStream dis = new DataInputStream(s.getInputStream());
Scanner scan = new Scanner(System.in);

System.out.println("请输入用户代码: ");
userCode = "userCode:" + scan.nextLine();
dos.writeUTF(userCode);

System.out.println("请输入产品代码: ");
productKey = "productKey:" + scan.nextLine();
dos.writeUTF(productKey);

productActivationCode = dis.readUTF();
System.out.println(productActivationCode);

dos.close();
dis.close();
s.close();

}
}
--------------------编程问答-------------------- 用阻塞来创建,好主意...关注下 --------------------编程问答-------------------- 创建一个公共的容器,收线程只管往里放,发线程只管从容器里取值,并处理后发出验证码。

容器加锁,这样可以吗? --------------------编程问答--------------------
引用 8 楼  的回复:
创建一个公共的容器,收线程只管往里放,发线程只管从容器里取值,并处理后发出验证码。

容器加锁,这样可以吗?



貌似是这个道理。。。

昨天请教一了一下其他人,说是有个非阻塞模式。。。但是不会写。。。求指点…… --------------------编程问答--------------------

谢谢指点,根据你的提示我已经写出可以多个用户同时访问服务端了。
还想请教一下。。如果我想用两个线程来处理这个问题,一个线程用于专门接收数据,一个线程用于专门返回数据,应该怎么做呢,锁怎么加呢。。。异步索这个问题困扰我好久了。
想了下用 vector ,先连接的用户写入 vector 中,一个用户处理完了再提取第二个用户。不知道这样对不对。。但是我不知道程序具体应该怎么写出来。。。

能不能再指点一下下。。

感觉你这道题,要收了发分开来吗?如果功能只局限于你上面画的图,感觉没必要分。先撇开这个不管。
如果要多线程。
可以在client里面放两个实现Runnable的class 内部内。放外面也行啊。SendThread,ReceiveThread
接着启动这两个线程还是继续堵塞性方法。就可以了。
NIO Socket网上有代码,如果有必要可以去学习下。
还有你说的安全性问题。就是对序列号自增问题?如果是递增,这个要考虑安全性问题。写个递增方法,加把锁sychronized 应该就可以了。还有一种是加原子锁,网上也有实例。对照学习。 --------------------编程问答-------------------- 可以试试服务端只弄一个收、发线程。这样也不用考虑服务端的并发了。。。
但这样效率没那么快 --------------------编程问答-------------------- 用apache MINA的服务器端NIO框架 --------------------编程问答--------------------
引用 1 楼  的回复:
好好重构一下吧,给你点思路
Java code
SeverSocket ss = new SeverSocket(8888);
while(true){
Socket s = ss.accept();
ClientThread ct = new ClientThread(s);
new Thread(ct).start;
}
class ClientThread implements Run……


思路同上、抛砖引玉。
补充:Java ,  Java SE
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,