Java 网络斗地主
项目要求:
运用多线程知识构建一个多客户端的斗地主程序,斗地主功能完善,利用Socket实现客户端和服务器端的信息交互。
未完成 进展:
客户端:
MainJFrame类
public class MainFrame extends JFrame{
public MyPanel myPanel;
public String uname;
public Socket socket;
public SendThread sendThread;
public MainFrame(String uname, Socket socket){
this.uname = uname;
this.socket = socket;
//设置窗口属性
this.setSize(1200,700);
this.setVisible(true);
this.setLocationRelativeTo(null);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//添加Mypanel
myPanel = new MyPanel();
myPanel.setBounds(0,0,1200,700);
this.add(myPanel);
//启动发消息的线程
sendThread = new SendThread(socket,uname);
sendThread.start();
}
}
MyPanel类
public class MyPanel extends JPanel {
@Override
protected void paintComponent(Graphics g) {
Image image = new ImageIcon("images/bg/bg1.png").getImage();
g.drawImage(image,0,0,this.getWidth(),this.getHeight(),null);
}
}
Login类
public class Login extends JFrame {
private JLabel uanmeJLabel;
private JTextField unameJTextField;
private JButton btnJButton;
public Login(){
this.uanmeJLabel = new JLabel("登录名:");
this.unameJTextField = new JTextField();
this.btnJButton = new JButton("登录");
this.setSize(500,200);
this.setVisible(true);
this.setLocationRelativeTo(null);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setLayout(new GridLayout(1,3));
this.add(uanmeJLabel);
this.add(unameJTextField);
this.add(btnJButton);
//创建我们的监听器对象 绑定到按钮上
MyEvent myEvent = new MyEvent();
this.btnJButton.addActionListener(myEvent);
}
//创建事件监听器
class MyEvent implements ActionListener{
@Override
public void actionPerformed(ActionEvent e) {
//获取用户名
String uname = unameJTextField.getText();
//创建一个socket连接服务器
try {
Socket socket = new Socket("127.0.0.1",6666);
//跳转到主窗口
new MainFrame(uname,socket);
} catch (IOException e1) {
e1.printStackTrace();
}
}
}
}
SendThread类
public class SendThread extends Thread {
private Socket socket;
private String msg;
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public Socket getSocket() {
return socket;
}
public void setSocket(Socket socket) {
this.socket = socket;
}
public SendThread(){
}
public SendThread(Socket socket){
this.socket = socket;
}
public SendThread(Socket socket,String msg){
this.socket = socket;
this.msg = msg;
}
public void run(){
//字节流
//转换 数据流 数据的输入输出流可以写任何类型的数据
DataOutputStream dataOutputStream ;
try {
dataOutputStream = new DataOutputStream(socket.getOutputStream());
while (true) {
//如果消息不为空
if (msg != null) {
//发送消息
dataOutputStream.writeUTF(msg);
//之后清空消息
msg = null;
}
}
} catch (IOException e) {
e.printStackTrace();
}
//wirteUTF 写出UTF格式的字符串
}
}
服务器端
MainJFrame类
public class MainFrame {
//创建玩家列表
public List<Player> players = new ArrayList<Player>();
public int index = 0;
//全部扑克的列表
public List<Poker> allPokers = new ArrayList<Poker>();
public MainFrame() {
//创建扑克列表
createPoker();
try {
//创建服务器端的Socket
ServerSocket serverSocket = new ServerSocket(6666);
//需要一直接收加一个while
while (true) {
//接收客户端的Socket
Socket socket = serverSocket.accept();
//开启线程,处理客户端的Socket
AcceptThread acceptThread = new AcceptThread(socket);
acceptThread.start();
}
} catch (IOException e) {
e.printStackTrace();
}
}
//创建一个内部线程
class AcceptThread extends Thread{
Socket socket;
public AcceptThread(Socket socket){
this.socket = socket;
}
public void run(){
try {
//和客户端对应也是用的数据流
DataInputStream dataInputStream = new DataInputStream(socket.getInputStream());
while (true){
String msg = dataInputStream.readUTF();
//创建一个player对象
Player player = new Player(index++,msg);
player.setSocket(socket);
players.add(player);
System.out.println("这是客户端传来的消息:"+ msg + "上线了");
System.out.println("上线人数:"+players.size());
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
//创建所有扑克
public void createPoker(){
}
}
poker类
//扑克类
public class Poker {
private int id;//扑克id
private String name;//扑克名称
private int num;//扑克数量
private boolean isOut;//是否打出
public Poker() {
}
public Poker(int id, String name, int num) {
this.id = id;
this.name = name;
this.num = num;
}
public boolean isOut() {
return isOut;
}
public void setOut(boolean out) {
isOut = out;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getNamr() {
return name;
}
public void setNamr(String name) {
this.name = name;
}
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
}
player类
//玩家类
public class Player {
private int id;//玩家id
private String name;//玩家名称
private Socket socket;//玩家对应的Socket
private List<Poker> pokers = new ArrayList<>();//玩家的扑克
public Player() {
}
public Player(int id) {
this.id = id;
}
public Player(int id, String name) {
this.id = id;
this.name = name;
}
public Player(int id, String name, Socket socket, List<Poker> pokers) {
this.id = id;
this.name = name;
this.socket = socket;
this.pokers = pokers;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Socket getSocket() {
return socket;
}
public void setSocket(Socket socket) {
this.socket = socket;
}
public List<Poker> getPokers() {
return pokers;
}
public void setPokers(List<Poker> pokers) {
this.pokers = pokers;
}
}
暂时效果: