你在程序環(huán)節(jié)就判定是否存在數(shù)據(jù)庫(kù)中就行了,對(duì)于每個(gè)將存入數(shù)據(jù)庫(kù)的數(shù)據(jù)用一個(gè)Set存儲(chǔ),如果Set中出現(xiàn),重新調(diào)用random()。
你所需要的網(wǎng)站建設(shè)服務(wù),我們均能行業(yè)靠前的水平為你提供.標(biāo)準(zhǔn)是產(chǎn)品質(zhì)量的保證,主要從事做網(wǎng)站、網(wǎng)站制作、企業(yè)網(wǎng)站建設(shè)、手機(jī)網(wǎng)站制作設(shè)計(jì)、網(wǎng)頁(yè)設(shè)計(jì)、品牌網(wǎng)站制作、網(wǎng)頁(yè)制作、做網(wǎng)站、建網(wǎng)站。成都創(chuàng)新互聯(lián)擁有實(shí)力堅(jiān)強(qiáng)的技術(shù)研發(fā)團(tuán)隊(duì)及素養(yǎng)的視覺(jué)設(shè)計(jì)專才。
另外,對(duì)于服務(wù)器重啟Set數(shù)據(jù)丟失的問(wèn)題,可以將Set中數(shù)據(jù)序列化到一個(gè)文本文件,重啟時(shí)再導(dǎo)入就行了。
這么做的好處是可以用多線程來(lái)控制判定環(huán)節(jié),不會(huì)造成瓶頸堵塞。
用java是可以寫出qq的,只不過(guò)用java開(kāi)發(fā)c/s的軟件不是java特長(zhǎng)的,你要是真的想寫,就寫著練練手吧,最起碼可以鞏固java se上的知識(shí)。
具體怎么寫,給你個(gè)大概的思路吧,因?yàn)槲覜](méi)辦法在這個(gè)有限的輸入框內(nèi)把所有的代碼寫完。
【1】先寫出qq的簡(jiǎn)單界面
【2】給每個(gè)按鈕添加監(jiān)聽(tīng)
【3】按鈕事件(方法)定義
【4】連接網(wǎng)絡(luò)(socket)
【5】測(cè)試
【5】其他功能添加
【6】測(cè)試
有兩個(gè)類,服務(wù)器和客戶端、
服務(wù)器類代碼:
package chat;
import java.io.*;
import java.net.*;
import java.util.*;
/*服務(wù)器類*/
public class Server {
public ListSocket socketList = new ArrayListSocket();//存放所有連接的客戶端的集合
public ServerSocket server;//服務(wù)器
public int portNum;//端口號(hào)
public Server(int portNum){
this.portNum = portNum;
}
public void innit(){
try {
server = new ServerSocket(portNum);
System.out.println("服務(wù)器開(kāi)啟成功!");
int socketNum = 0;
while(true){
Socket socket = server.accept();//被動(dòng)等待客戶端的連接
socketNum++;
System.out.println("第"+socketNum+"個(gè)客戶端連接成功??!");
socketList.add(socket);//連接的客戶端存放到集合里面
new RWThread(socket).start();
}
} catch (IOException e) {
e.printStackTrace();
}
}
class RWThread extends Thread{//接收和發(fā)送消息的線程
public Socket socket;
public RWThread(Socket socket){
this.socket = socket;
}
public void run() {
super.run();
try {
BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
while(true){
String message = br.readLine();
System.out.println(message);//接收客戶端發(fā)來(lái)的消息
for(int i=0;isocketList.size();i++){//發(fā)送給所有連接的客戶端
PrintWriter pw = new PrintWriter(new OutputStreamWriter(socketList.get(i).getOutputStream()));
pw.println(message);
pw.flush();
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
int portNum = 8888;//創(chuàng)建服務(wù)器的端口號(hào)
Server server = new Server(portNum);
server.innit();
}
}
客戶端類:
package chat;
import java.io.*;
import java.net.*;
import java.util.*;
/*客戶端類*/
public class Client {
public Socket socket;
public Client(){
Scanner sca = new Scanner(System.in);
try {
socket = new Socket("127.0.0.1",8888);//創(chuàng)建客戶端
new ReadThread(socket).start();//開(kāi)啟讀取從服務(wù)器端發(fā)來(lái)的信息
while(true){
PrintWriter pw = new PrintWriter(new OutputStreamWriter(socket.getOutputStream()));
String message = sca.nextLine();
pw.println(message);//向服務(wù)器發(fā)送信息
pw.flush();
}
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
System.out.println("錯(cuò)誤:服務(wù)器未開(kāi)啟!??!");
}
}
class ReadThread extends Thread{//讀取服務(wù)器發(fā)來(lái)信息的線程
public Socket socket;
public ReadThread(Socket socket){
this.socket = socket;
}
public void run() {
super.run();
try {
BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
while(true){
String message = br.readLine();
System.out.println(message);//輸出信息
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
Client client = new Client();
}
}
現(xiàn)打開(kāi)服務(wù)器類,然后可以打開(kāi)多個(gè)客戶端進(jìn)行聊天