目的:做一個(gè)簡單的多玩家多線程的猜拳游戲。每個(gè)客戶機(jī)都與服務(wù)端的一個(gè)套接字進(jìn)行通信,但是各個(gè)客戶機(jī)之間不進(jìn)行通信。服務(wù)器受到客戶機(jī)的連接請求時(shí)會創(chuàng)建新的套接字并使其與客戶機(jī)連接。然后啟動(dòng)線程與客戶機(jī)進(jìn)行數(shù)據(jù)交換。套接字管理器是一個(gè)Vector,用于管理套接字的個(gè)數(shù)及其連接狀態(tài)。
游戲描述:玩家通過向服務(wù)器發(fā)送0,1,2這個(gè)三個(gè)數(shù)字,用來代表剪刀,錘包,袱。服務(wù)器接到信息后會隨機(jī)產(chǎn)生0,1,2這三個(gè)數(shù)字的其中的一個(gè)。在客戶機(jī)上通過比較來進(jìn)行判斷輸贏。
服務(wù)端:
客戶端:
服務(wù)端代碼:Server4.java
====================
import java.net.*;
import java.io.*;
import java.util.*;
public class Server4 {
private ServerSocket server;
Vector sManager=new Vector();//管理套接字的Vector
Random rnd=new Random();//創(chuàng)建隨機(jī)數(shù)的發(fā)生器
public Server4(){}
void startServer() //運(yùn)行服務(wù)器
{
try
{
server=new ServerSocket(8888);
System.out.println("服務(wù)器套接字已創(chuàng)建成功!");
while(true)
{
Socket socket=server.accept();
System.out.println("已經(jīng)與客戶機(jī)連接");
new KBBCom_Thread(socket).start();
sManager.add(socket);
System.out.println("當(dāng)前客戶機(jī)連結(jié)數(shù):"+sManager.size());
}
}catch(Exception e){}
}
public static void main(String[] args) {
Server4 server=new Server4();
server.startServer();
}
class KBBCom_Thread extends Thread//與客戶機(jī)進(jìn)行通信的線程累
{
Socket socket; //套接字引用變量
private DataInputStream reader; //套接字輸入流
private DataOutputStream writer; //套接字輸出流
KBBCom_Thread(Socket socket) //構(gòu)造函數(shù)
{
this.socket=socket;
}
public void run()
{
try
{
//獲取套接字的輸入輸出流
reader=new DataInputStream(socket.getInputStream());
writer=new DataOutputStream(socket.getOutputStream());
String msg;
//如果收到客戶端發(fā)來的數(shù)據(jù)
while((msg=reader.readUTF())!=null)
{
//向客戶機(jī)傳送0-2之間的整型隨機(jī)數(shù)
writer.writeUTF(rnd.nextInt(3)+"n");
writer.flush();
System.out.println("來自客戶機(jī):"+msg);
}
}catch(Exception e){}finally
{
try
{
sManager.remove(socket); //刪除套接字
//關(guān)閉輸入輸出流及套接字
if(reader!=null)reader.close();
if(writer!=null)writer.close();
if(socket!=null)socket.close();
reader=null;
writer=null;
socket=null;
//向屏幕輸出相關(guān)信息
System.out.println("客戶機(jī)離開");
System.out.println("當(dāng)前客戶機(jī)的連接數(shù):"+sManager.size());
}catch(Exception e){}
}
}
}
} 知識點(diǎn):套接字管理器(Vector)會將于客戶機(jī)連接的套接字添加到其列表中,在客戶機(jī)斷開連接后,在將相應(yīng)的套接自從列表中刪除,從中可以看出,客戶機(jī)連接數(shù)與列表中添加套接字?jǐn)?shù)目是一致的。
Vector sManager=new Vector();
sManager.add(socket); // 向列表添加套接字
sManager.remove(socket); //從列表移除套接字
sManager.size();//獲取客戶機(jī)連接數(shù)
客戶端代碼:Client4.mxml
==================================================================================
import flash.net.Socket;
import flash.utils.ByteArray;
import flash.events.ProgressEvent;
private var socket:Socket=new Socket();
private var intClient:int;//定義客戶端數(shù)字出拳
private var intServer:int; //定義服務(wù)端數(shù)字出拳
private var intSY:int; //定義輸贏判斷
private var strClient:String; //客戶端文字出拳
private var strServer:String; //服務(wù)端的文字出拳
internal function initApp():void
{
socket.connect("127.0.0.1",8888);
socket.addEventListener(Event.CONNECT,funConnect);
socket.addEventListener(Event.CLOSE,funClose);
socket.addEventListener(ProgressEvent.SOCKET_DATA,funSocket);
}
internal function funConnect(event:Event):void
{
myText.text+="連接已建立 n";
}
internal function funClose(event:Event):void
{
myText.text+="連接已關(guān)閉 n";
}
internal function sendMessage(msg:String):void
{
var message:ByteArray=new ByteArray();
message.writeUTF(msg); //發(fā)送出拳數(shù)字
socket.writeBytes(message);
socket.flush();
intClient=int(msg);
switch(intClient) //將數(shù)字轉(zhuǎn)換成文字用于發(fā)布到屏幕上
{
case 0:
strClient="剪刀";
break;
case 1:
strClient="錘";
break;
case 2:
strClient="包袱";
break;
}
myText.text+="你出:"+strClient+"; ";
myInput.text="";
}
internal function funSocket(event:ProgressEvent):void//接到服務(wù)器信息
{
var msg:String="";
while(socket.bytesAvailable)
{
msg=socket.readUTF();
intServer=int(msg);
intSY=intClient-intServer;//通過數(shù)值判斷輸贏
switch(intServer) //將數(shù)字轉(zhuǎn)換成文字用于發(fā)布到屏幕上
{
case 0:
strServer="剪刀";
break;
case 1:
strServer="錘";
break;
case 2:
strServer="包袱";
break;
}
myText.text+="服務(wù)器出:"+strServer+"; ";
//判斷輸贏的算法
if(intSY>0&&intSY<2)
{
myText.text+=" 結(jié)果:你贏了 n";
}else if(intClient==intServer)
{
myText.text+=" 結(jié)果:平手 n";
}else if(intSY<0&&intSY>-2)
{
myText.text+=" 結(jié)果:你輸了 n";
}else if(intSY>=2)
{
myText.text+=" 結(jié)果:你輸了 n";
}else if(intSY<=-2)
{
myText.text+=" 結(jié)果:你贏了 n";
}
myText.verticalScrollPosition = myText.maxVerticalScrollPosition;// myText滾動(dòng)到最下面
}
}
]]>
這是我的學(xué)習(xí)筆記,簡單的記敘了flex+java如何進(jìn)行socket通信。希望對有需要的人有所幫助
游戲描述:玩家通過向服務(wù)器發(fā)送0,1,2這個(gè)三個(gè)數(shù)字,用來代表剪刀,錘包,袱。服務(wù)器接到信息后會隨機(jī)產(chǎn)生0,1,2這三個(gè)數(shù)字的其中的一個(gè)。在客戶機(jī)上通過比較來進(jìn)行判斷輸贏。
服務(wù)端:
客戶端:
服務(wù)端代碼:Server4.java
====================
import java.net.*;
import java.io.*;
import java.util.*;
public class Server4 {
private ServerSocket server;
Vector sManager=new Vector();//管理套接字的Vector
Random rnd=new Random();//創(chuàng)建隨機(jī)數(shù)的發(fā)生器
public Server4(){}
void startServer() //運(yùn)行服務(wù)器
{
try
{
server=new ServerSocket(8888);
System.out.println("服務(wù)器套接字已創(chuàng)建成功!");
while(true)
{
Socket socket=server.accept();
System.out.println("已經(jīng)與客戶機(jī)連接");
new KBBCom_Thread(socket).start();
sManager.add(socket);
System.out.println("當(dāng)前客戶機(jī)連結(jié)數(shù):"+sManager.size());
}
}catch(Exception e){}
}
public static void main(String[] args) {
Server4 server=new Server4();
server.startServer();
}
class KBBCom_Thread extends Thread//與客戶機(jī)進(jìn)行通信的線程累
{
Socket socket; //套接字引用變量
private DataInputStream reader; //套接字輸入流
private DataOutputStream writer; //套接字輸出流
KBBCom_Thread(Socket socket) //構(gòu)造函數(shù)
{
this.socket=socket;
}
public void run()
{
try
{
//獲取套接字的輸入輸出流
reader=new DataInputStream(socket.getInputStream());
writer=new DataOutputStream(socket.getOutputStream());
String msg;
//如果收到客戶端發(fā)來的數(shù)據(jù)
while((msg=reader.readUTF())!=null)
{
//向客戶機(jī)傳送0-2之間的整型隨機(jī)數(shù)
writer.writeUTF(rnd.nextInt(3)+"n");
writer.flush();
System.out.println("來自客戶機(jī):"+msg);
}
}catch(Exception e){}finally
{
try
{
sManager.remove(socket); //刪除套接字
//關(guān)閉輸入輸出流及套接字
if(reader!=null)reader.close();
if(writer!=null)writer.close();
if(socket!=null)socket.close();
reader=null;
writer=null;
socket=null;
//向屏幕輸出相關(guān)信息
System.out.println("客戶機(jī)離開");
System.out.println("當(dāng)前客戶機(jī)的連接數(shù):"+sManager.size());
}catch(Exception e){}
}
}
}
} 知識點(diǎn):套接字管理器(Vector)會將于客戶機(jī)連接的套接字添加到其列表中,在客戶機(jī)斷開連接后,在將相應(yīng)的套接自從列表中刪除,從中可以看出,客戶機(jī)連接數(shù)與列表中添加套接字?jǐn)?shù)目是一致的。
Vector sManager=new Vector();
sManager.add(socket); // 向列表添加套接字
sManager.remove(socket); //從列表移除套接字
sManager.size();//獲取客戶機(jī)連接數(shù)
客戶端代碼:Client4.mxml
==================================================================================
import flash.net.Socket;
import flash.utils.ByteArray;
import flash.events.ProgressEvent;
private var socket:Socket=new Socket();
private var intClient:int;//定義客戶端數(shù)字出拳
private var intServer:int; //定義服務(wù)端數(shù)字出拳
private var intSY:int; //定義輸贏判斷
private var strClient:String; //客戶端文字出拳
private var strServer:String; //服務(wù)端的文字出拳
internal function initApp():void
{
socket.connect("127.0.0.1",8888);
socket.addEventListener(Event.CONNECT,funConnect);
socket.addEventListener(Event.CLOSE,funClose);
socket.addEventListener(ProgressEvent.SOCKET_DATA,funSocket);
}
internal function funConnect(event:Event):void
{
myText.text+="連接已建立 n";
}
internal function funClose(event:Event):void
{
myText.text+="連接已關(guān)閉 n";
}
internal function sendMessage(msg:String):void
{
var message:ByteArray=new ByteArray();
message.writeUTF(msg); //發(fā)送出拳數(shù)字
socket.writeBytes(message);
socket.flush();
intClient=int(msg);
switch(intClient) //將數(shù)字轉(zhuǎn)換成文字用于發(fā)布到屏幕上
{
case 0:
strClient="剪刀";
break;
case 1:
strClient="錘";
break;
case 2:
strClient="包袱";
break;
}
myText.text+="你出:"+strClient+"; ";
myInput.text="";
}
internal function funSocket(event:ProgressEvent):void//接到服務(wù)器信息
{
var msg:String="";
while(socket.bytesAvailable)
{
msg=socket.readUTF();
intServer=int(msg);
intSY=intClient-intServer;//通過數(shù)值判斷輸贏
switch(intServer) //將數(shù)字轉(zhuǎn)換成文字用于發(fā)布到屏幕上
{
case 0:
strServer="剪刀";
break;
case 1:
strServer="錘";
break;
case 2:
strServer="包袱";
break;
}
myText.text+="服務(wù)器出:"+strServer+"; ";
//判斷輸贏的算法
if(intSY>0&&intSY<2)
{
myText.text+=" 結(jié)果:你贏了 n";
}else if(intClient==intServer)
{
myText.text+=" 結(jié)果:平手 n";
}else if(intSY<0&&intSY>-2)
{
myText.text+=" 結(jié)果:你輸了 n";
}else if(intSY>=2)
{
myText.text+=" 結(jié)果:你輸了 n";
}else if(intSY<=-2)
{
myText.text+=" 結(jié)果:你贏了 n";
}
myText.verticalScrollPosition = myText.maxVerticalScrollPosition;// myText滾動(dòng)到最下面
}
}
]]>
這是我的學(xué)習(xí)筆記,簡單的記敘了flex+java如何進(jìn)行socket通信。希望對有需要的人有所幫助

