关于socket一个简单游戏的问题

baidu_30716467 2015-08-19 08:17:40
因为没学过socket,并且对流也不是很清楚,老师要求需要socket,所以从网上找些代码,并加以修改,发现最后无法交互,看了好多次也找不出问题所在。所以只能在论坛上询问诸位大神了。
下面贴下代码:
服务端
package server;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.OutputStream;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.Reader;
import java.net.ServerSocket;
import java.net.Socket;
import java.nio.Buffer;


public class Server1 {
static int i=(int) (Math.random()*3);
public static void main(String[] args){
try {
ServerSocket serverSocket =new ServerSocket(8888);
Socket socket=serverSocket.accept();
//输入流获取客户端信息
InputStream is = socket.getInputStream();
InputStreamReader isReader = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isReader);
String info=null;
while((info=br.readLine())!=null){
int d=Integer.parseInt(info);
if(d==i)
System.out.println("对手出的是: "+d+"我出的是: "+i+" ***平局***");
if(d>i)
System.out.println("对手出的是: "+d+"我出的是: "+i+" ***对方赢了***");
if(d<i)
System.out.println("对手出的是: "+d+"我出的是: "+i+" ***我赢了***");
}
socket.shutdownInput();//关闭输入流
//获取输出流
OutputStream os = socket.getOutputStream();
PrintWriter pw = new PrintWriter(os);
String t = String.valueOf(i);
pw.write(t);
pw.flush();//刷新缓存
} catch (IOException e) {
e.printStackTrace();
}
}
}
客户端
package server;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;

public class Client1 {
static int i=(int) (Math.random()*3);
public static void main(String[] args) {
try {
//创建客户端socket;
Socket socket =new Socket("localhost",8888);
//获取输出流向服务器端发送信息
OutputStream os=socket.getOutputStream();//字节输入流
PrintWriter pw=new PrintWriter(os);//输出流包装为打印流
String t = String.valueOf(i);//将i转为String类型
pw.write(t);
pw.flush();
socket.shutdownOutput();
//获取输入流用来读取服务端的响应信息
InputStream is=socket.getInputStream();
BufferedReader br =new BufferedReader(new InputStreamReader(is));//字节流包装为字符流
String info=null;
while((info=br.readLine())!=null){
int d=Integer.parseInt(info);//将info转为int 类型用于下面的比较
if(d==i)
System.out.println("对手出的是: "+d+"我出的是: "+i+" ***平局***");
if(d>i)
System.out.println("对手出的是: "+d+"我出的是: "+i+" ***对方赢了***");
if(d<i)
System.out.println("对手出的是: "+d+"我出的是: "+i+" ***我赢了***");
}
//关闭资源
br.close();
is.close();
pw.close();
os.close();
socket.close();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}

}

}
这上面两段代码是从网上socket例子中修改后不带UI界面的,可以运行的。然后我带了UI界面的就不行了。

...全文
245 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
0萌萌哒0 2015-08-22
  • 打赏
  • 举报
回复
那个代码现在应该是能用的阶段。。我这里测试是好的:
先点服务器(左边窗口)的任意一个按钮,然后点客户端(右边窗口)的任意一个按钮,等大约250ms以后就可以看到结果。

期间不要点击多次。

第二个问题,可以先将客户端和服务端连接,然后用流进行交互,直到断开连接。期间只使用一个连接,而不是每次都新开一个连接。
第三个问题和第二个问题相似,都需要建立明确的交互模型来解决。如果你想了解,需要先理解socket建立连接、数据交换和连接关闭这一系列流程,才能在此之上建立合适的数据交互模型(即数据交换协议,俗称两程序通信的约定)。
第四个问题,涉及Swing和线程。绘制java界面和使用socket都需要cpu,如果这两个活放在同一个线程下就不能一起开展(这个去查查线程是什么就知道了),因此当你在处理按钮事件时(此时在swing线程中)调用阻塞的socket就会导致swing线程专注于你的socket通信任务,而无法响应其他事件。这个问题可以通过开设一个独立的工作线程来解决。

有时间我会给你写一个没有以上几点缺陷的示例程序。
baidu_30716467 2015-08-21
  • 打赏
  • 举报
回复
引用 3 楼 mg2flyingff 的回复:
你的代码出现了这么几个问题: 1、 构造函数开头new的JFrame完全没用,因为你的类已经extends jframe了(这不重要,一些细节我也略过了); 2、主函数里面不要调用socket或者client,因为这两个函数每调用一次就相当于开启一个tcp服务器/客户端,所以仅当用户按下按钮时触发就好; 3、交互模型存在问题,java中socket无法判断对方是否关闭连接,除非发起io请求,因此我们应约定交换的数据都以换行("\n")结尾,且只读一次;然后等待一小段时间关闭。 4、程序的设计缺陷,只能服务器先点,客户端再点,且点了一下以后整个界面就死掉了(因为你在响应事件函数中调用了阻塞的socket函数)。 我给你简单的修改了一下代码,现在程序处于”能用“的阶段。部分修改处增加了XXX标志。 客户端:

import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;

public class Client extends JFrame {
	private static final long serialVersionUID = 7388327725127247126L;
	private JLabel jl, jl1, jl2, jl3, jl4;
	int i;
	String c = "";
	final String[] arr = new String[3];

	public void pic() {
		arr[0] = "st.png";// 石头
		arr[1] = "jd.png";// 剪刀
		arr[2] = "b.png";// 布
	}

	public Client() {
		jl = new JLabel();
		jl1 = new JLabel();
		jl2 = new JLabel();
		jl3 = new JLabel();
		jl4 = new JLabel();
	}

	public void ClientJF() {
		this.setSize(500, 400);
		this.setTitle("猜拳游戏");
		this.setLayout(null);

		jl = new JLabel("服务端:");
		jl.setFont(new java.awt.Font("黑体", Font.BOLD, 20));
		jl.setBounds(50, 95, 150, 50);
		this.add(jl);
		jl1 = new JLabel("客户端:");
		jl1.setFont(new java.awt.Font("黑体", Font.BOLD, 20));
		jl1.setBounds(50, 195, 150, 50);
		this.add(jl1);

		// 电脑出招的图片
		jl2 = new JLabel();
		jl2.setBounds(170, 75, 145, 95);
		this.add(jl2);

		// 人出招的图片
		jl3 = new JLabel();
		jl3.setBounds(170, 185, 145, 95);
		this.add(jl3);

		// 输赢结果显示
		jl4 = new JLabel("");
		jl4.setFont(new java.awt.Font("黑体", Font.BOLD, 30));
		jl4.setBounds(200, 300, 100, 70);
		this.add(jl4);

		// 按钮
		Font f = new Font("黑体", 0, 18);// 设置按钮字体
		final JButton btn = new JButton("石头");
		btn.setFont(f);
		btn.setBounds(380, 60, 70, 60);
		this.add(btn);

		final JButton btn1 = new JButton("剪刀");
		btn1.setFont(f);
		btn1.setBounds(380, 160, 70, 60);
		this.add(btn1);

		final JButton btn2 = new JButton("布");
		btn2.setFont(f);
		btn2.setBounds(380, 260, 70, 60);
		this.add(btn2);

		// 按钮事件监听
		btn.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent arg0) {
				// 如果你鼠标点击的是石头按钮
				i = 0;
				String b = btn.getActionCommand();
				jl3.setText(b);
				jl3.setIcon(new ImageIcon("st.png"));
				client();
				// Client.this.jl2.setIcon(new ImageIcon(c));
			}
		});
		btn1.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent arg0) {
				i = 1;
				String b1 = btn1.getActionCommand();
				jl3.setText(b1);
				jl3.setIcon(new ImageIcon("jd.png"));
				client();
				// Client.this.jl2.setIcon(new ImageIcon(c));
			}
		});
		btn2.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent arg0) {
				i = 2;
				String b2 = btn2.getActionCommand();
				jl3.setText(b2);
				jl3.setIcon(new ImageIcon("b.png"));
				client();
				// Client.this.jl2.setIcon(new ImageIcon(c));
			}
		});
		this.setVisible(true);// 使窗口可见
		this.setDefaultCloseOperation(EXIT_ON_CLOSE);
		this.setLocationRelativeTo(null);// (Component c)设置窗口相对于指定组件的位置。
		                                 // 如果组件当前未显示,或者 c 为 null,则此窗口将置于屏幕的中央
		this.setResizable(false);// 使其不可最大化
	}

	public void client() {
		try {
			// 创建客户端socket;
			Socket socket = new Socket("localhost", 8888);
			// 获取输入流用来读取服务端的响应信息
			InputStream is = socket.getInputStream();
			BufferedReader br = new BufferedReader(new InputStreamReader(is));// 字节流包装为字符流
			String info = null;
			// 获取输出流向服务器端发送信息
			OutputStream os = socket.getOutputStream();// 字节输入流
			PrintWriter pw = new PrintWriter(os);// 输出流包装为打印流
			// XXX
			String t = String.valueOf(i) + "\n";// 将i转为String类型
			pw.write(t);
			pw.flush();
			info = br.readLine();
			{
				int d = Integer.parseInt(info);// 将info转为int 类型用于下面的比较
				c = arr[d];
				Client.this.jl2.setIcon(new ImageIcon(c));
				if (d == i)
					jl4.setText("平手");
				if (d > i)
					jl4.setText("你输了");
				if (d < i)
					jl4.setText("你赢了");
			}
			Thread.sleep(250);
			socket.shutdownOutput();
			pw.close();
			os.close();
			// 关闭资源
			br.close();
			is.close();
			socket.close();

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

	}

	public void rungame() {
		ClientJF();
		// XXX
		//Client();
	}

	public static void main(String[] args) {
		Client testClient = new Client();
		testClient.rungame();
	}
}
服务端:

import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;

public class Server extends JFrame {
	private static final long serialVersionUID = 6929066428999708107L;
	private JLabel jl, jl1, jl2, jl3, jl4;
	int i;
	String c = "";
	final String[] arr = new String[3];

	public Server() {
		jl = new JLabel();
		jl1 = new JLabel();
		jl2 = new JLabel();
		jl3 = new JLabel();
		jl4 = new JLabel();
	}

	public void pic() {
		arr[0] = "st.png";// 石头
		arr[1] = "jd.png";// 剪刀
		arr[2] = "b.png";// 布
	}

	public void ServerJF() {
		this.setSize(500, 400);
		this.setTitle("猜拳游戏");
		this.setLayout(null);

		jl = new JLabel("客户端:");
		jl.setFont(new java.awt.Font("黑体", Font.BOLD, 20));
		jl.setBounds(50, 95, 150, 50);
		this.add(jl);
		jl1 = new JLabel("服务端:");
		jl1.setFont(new java.awt.Font("黑体", Font.BOLD, 20));
		jl1.setBounds(50, 195, 150, 50);
		this.add(jl1);

		// 客户端出招的图片
		jl2 = new JLabel();
		jl2.setBounds(170, 75, 145, 95);
		this.add(jl2);

		// 服务端出招的图片
		jl3 = new JLabel();
		jl3.setBounds(170, 185, 145, 95);
		this.add(jl3);

		// 输赢结果显示
		jl4 = new JLabel("");
		jl4.setFont(new java.awt.Font("黑体", Font.BOLD, 30));
		jl4.setBounds(200, 300, 100, 70);
		this.add(jl4);

		// 按钮
		Font f = new Font("黑体", 0, 18);// 设置按钮字体
		final JButton btn = new JButton("石头");
		btn.setFont(f);
		btn.setBounds(380, 60, 70, 60);
		this.add(btn);

		final JButton btn1 = new JButton("剪刀");
		btn1.setFont(f);
		btn1.setBounds(380, 160, 70, 60);
		this.add(btn1);

		final JButton btn2 = new JButton("布");
		btn2.setFont(f);
		btn2.setBounds(380, 260, 70, 60);
		this.add(btn2);

		// 按钮事件监听
		btn.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent arg0) {
				// 如果你鼠标点击的是石头按钮
				i = 0;
				String b = btn.getActionCommand();
				jl3.setText(b);
				jl3.setIcon(new ImageIcon("st.png"));
				socket();
				// Server.this.jl2.setIcon(new ImageIcon(c));
			}
		});
		btn1.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent arg0) {
				i = 1;
				String b1 = btn1.getActionCommand();
				jl3.setText(b1);
				jl3.setIcon(new ImageIcon("jd.png"));
				socket();
				// Server.this.jl2.setIcon(new ImageIcon(c));
			}
		});
		btn2.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent arg0) {
				i = 2;
				String b2 = btn2.getActionCommand();
				jl3.setText(b2);
				jl3.setIcon(new ImageIcon("b.png"));
				socket();
				// Server.this.jl2.setIcon(new ImageIcon(c));
			}
		});
		this.setVisible(true);// 使窗口可见
		this.setDefaultCloseOperation(EXIT_ON_CLOSE);
		this.setLocationRelativeTo(null);// (Component c)设置窗口相对于指定组件的位置。
		                                 // 如果组件当前未显示,或者 c 为 null,则此窗口将置于屏幕的中央
		this.setResizable(false);// 使其不可最大化
	}

	public void socket() {
		InputStream is = null;
		InputStreamReader isReader = null;
		BufferedReader br = null;
		OutputStream os = null;
		PrintWriter pw = null;
		try {
			ServerSocket serverSocket = new ServerSocket(8888);
			Socket socket = serverSocket.accept();
			// 获取输出流
			os = socket.getOutputStream();
			pw = new PrintWriter(os);
			// XXX
			String t = String.valueOf(i)+  "\n";
			pw.write(t);
			pw.flush();// 刷新缓存
			           // 输入流获取客户端信息
			is = socket.getInputStream();
			isReader = new InputStreamReader(is);
			br = new BufferedReader(isReader);
			String info = null;
			//while (() != null) 
			info = br.readLine();
			{
				int d = Integer.parseInt(info);
				c = arr[d];
				Server.this.jl2.setIcon(new ImageIcon(c));
				if (d == i)
					jl4.setText("平手");
				if (d > i)
					jl4.setText("你输了");
				if (d < i)
					jl4.setText("你赢了");
			}
			Thread.sleep(250);
			socket.shutdownInput();// 关闭输入流
			serverSocket.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public void rungame() {
		ServerJF();
		// XXX delete
		//socket();
	}

	public static void main(String[] args) {
		Server test = new Server();
		test.rungame();
	}
}
@mg2flyingff 你好,谢谢你解答。关于你说的4个问题,2,3两个我都考虑过,也找过关于聊天程序的socket例子,可是无法理解,只能按照自己看得懂的代码进行修改了 。 另外第4个问题,我有问过老师,老师知道我们做不出来好像,就说可以直接在客户端进行判断服务端有点,客户端才能点,否则就提示无法点击,至于界面死掉这个问题,我还不是很懂耶。 亲,你说现在那个代码是处于能用阶段么,为啥我点了之后就出现卡界面了,结果都没出来,这个是不是你说的第4个问题呢? 我都不懂论坛要怎么回复了。。
baidu_30716467 2015-08-21
  • 打赏
  • 举报
回复
@mg2flyingff 你好,谢谢你解答。关于你说的4个问题,2,3两个我都考虑过,也找过关于聊天程序的socket例子,可是无法理解,只能按照自己看得懂的代码进行修改了 。 另外第4个问题,我有问过老师,老师知道我们做不出来好像,就说可以直接在客户端进行判断服务端有点,客户端才能点,否则就提示无法点击,至于界面死掉这个问题,我还不是很懂耶。 亲,你说现在那个代码是处于能用阶段么,为啥我点了之后就出现卡界面了,结果都没出来,这个是不是你说的第4个问题呢?
0萌萌哒0 2015-08-20
  • 打赏
  • 举报
回复
你的代码出现了这么几个问题: 1、 构造函数开头new的JFrame完全没用,因为你的类已经extends jframe了(这不重要,一些细节我也略过了); 2、主函数里面不要调用socket或者client,因为这两个函数每调用一次就相当于开启一个tcp服务器/客户端,所以仅当用户按下按钮时触发就好; 3、交互模型存在问题,java中socket无法判断对方是否关闭连接,除非发起io请求,因此我们应约定交换的数据都以换行("\n")结尾,且只读一次;然后等待一小段时间关闭。 4、程序的设计缺陷,只能服务器先点,客户端再点,且点了一下以后整个界面就死掉了(因为你在响应事件函数中调用了阻塞的socket函数)。 我给你简单的修改了一下代码,现在程序处于”能用“的阶段。部分修改处增加了XXX标志。 客户端:

import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;

public class Client extends JFrame {
	private static final long serialVersionUID = 7388327725127247126L;
	private JLabel jl, jl1, jl2, jl3, jl4;
	int i;
	String c = "";
	final String[] arr = new String[3];

	public void pic() {
		arr[0] = "st.png";// 石头
		arr[1] = "jd.png";// 剪刀
		arr[2] = "b.png";// 布
	}

	public Client() {
		jl = new JLabel();
		jl1 = new JLabel();
		jl2 = new JLabel();
		jl3 = new JLabel();
		jl4 = new JLabel();
	}

	public void ClientJF() {
		this.setSize(500, 400);
		this.setTitle("猜拳游戏");
		this.setLayout(null);

		jl = new JLabel("服务端:");
		jl.setFont(new java.awt.Font("黑体", Font.BOLD, 20));
		jl.setBounds(50, 95, 150, 50);
		this.add(jl);
		jl1 = new JLabel("客户端:");
		jl1.setFont(new java.awt.Font("黑体", Font.BOLD, 20));
		jl1.setBounds(50, 195, 150, 50);
		this.add(jl1);

		// 电脑出招的图片
		jl2 = new JLabel();
		jl2.setBounds(170, 75, 145, 95);
		this.add(jl2);

		// 人出招的图片
		jl3 = new JLabel();
		jl3.setBounds(170, 185, 145, 95);
		this.add(jl3);

		// 输赢结果显示
		jl4 = new JLabel("");
		jl4.setFont(new java.awt.Font("黑体", Font.BOLD, 30));
		jl4.setBounds(200, 300, 100, 70);
		this.add(jl4);

		// 按钮
		Font f = new Font("黑体", 0, 18);// 设置按钮字体
		final JButton btn = new JButton("石头");
		btn.setFont(f);
		btn.setBounds(380, 60, 70, 60);
		this.add(btn);

		final JButton btn1 = new JButton("剪刀");
		btn1.setFont(f);
		btn1.setBounds(380, 160, 70, 60);
		this.add(btn1);

		final JButton btn2 = new JButton("布");
		btn2.setFont(f);
		btn2.setBounds(380, 260, 70, 60);
		this.add(btn2);

		// 按钮事件监听
		btn.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent arg0) {
				// 如果你鼠标点击的是石头按钮
				i = 0;
				String b = btn.getActionCommand();
				jl3.setText(b);
				jl3.setIcon(new ImageIcon("st.png"));
				client();
				// Client.this.jl2.setIcon(new ImageIcon(c));
			}
		});
		btn1.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent arg0) {
				i = 1;
				String b1 = btn1.getActionCommand();
				jl3.setText(b1);
				jl3.setIcon(new ImageIcon("jd.png"));
				client();
				// Client.this.jl2.setIcon(new ImageIcon(c));
			}
		});
		btn2.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent arg0) {
				i = 2;
				String b2 = btn2.getActionCommand();
				jl3.setText(b2);
				jl3.setIcon(new ImageIcon("b.png"));
				client();
				// Client.this.jl2.setIcon(new ImageIcon(c));
			}
		});
		this.setVisible(true);// 使窗口可见
		this.setDefaultCloseOperation(EXIT_ON_CLOSE);
		this.setLocationRelativeTo(null);// (Component c)设置窗口相对于指定组件的位置。
		                                 // 如果组件当前未显示,或者 c 为 null,则此窗口将置于屏幕的中央
		this.setResizable(false);// 使其不可最大化
	}

	public void client() {
		try {
			// 创建客户端socket;
			Socket socket = new Socket("localhost", 8888);
			// 获取输入流用来读取服务端的响应信息
			InputStream is = socket.getInputStream();
			BufferedReader br = new BufferedReader(new InputStreamReader(is));// 字节流包装为字符流
			String info = null;
			// 获取输出流向服务器端发送信息
			OutputStream os = socket.getOutputStream();// 字节输入流
			PrintWriter pw = new PrintWriter(os);// 输出流包装为打印流
			// XXX
			String t = String.valueOf(i) + "\n";// 将i转为String类型
			pw.write(t);
			pw.flush();
			info = br.readLine();
			{
				int d = Integer.parseInt(info);// 将info转为int 类型用于下面的比较
				c = arr[d];
				Client.this.jl2.setIcon(new ImageIcon(c));
				if (d == i)
					jl4.setText("平手");
				if (d > i)
					jl4.setText("你输了");
				if (d < i)
					jl4.setText("你赢了");
			}
			Thread.sleep(250);
			socket.shutdownOutput();
			pw.close();
			os.close();
			// 关闭资源
			br.close();
			is.close();
			socket.close();

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

	}

	public void rungame() {
		ClientJF();
		// XXX
		//Client();
	}

	public static void main(String[] args) {
		Client testClient = new Client();
		testClient.rungame();
	}
}
服务端:

import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;

public class Server extends JFrame {
	private static final long serialVersionUID = 6929066428999708107L;
	private JLabel jl, jl1, jl2, jl3, jl4;
	int i;
	String c = "";
	final String[] arr = new String[3];

	public Server() {
		jl = new JLabel();
		jl1 = new JLabel();
		jl2 = new JLabel();
		jl3 = new JLabel();
		jl4 = new JLabel();
	}

	public void pic() {
		arr[0] = "st.png";// 石头
		arr[1] = "jd.png";// 剪刀
		arr[2] = "b.png";// 布
	}

	public void ServerJF() {
		this.setSize(500, 400);
		this.setTitle("猜拳游戏");
		this.setLayout(null);

		jl = new JLabel("客户端:");
		jl.setFont(new java.awt.Font("黑体", Font.BOLD, 20));
		jl.setBounds(50, 95, 150, 50);
		this.add(jl);
		jl1 = new JLabel("服务端:");
		jl1.setFont(new java.awt.Font("黑体", Font.BOLD, 20));
		jl1.setBounds(50, 195, 150, 50);
		this.add(jl1);

		// 客户端出招的图片
		jl2 = new JLabel();
		jl2.setBounds(170, 75, 145, 95);
		this.add(jl2);

		// 服务端出招的图片
		jl3 = new JLabel();
		jl3.setBounds(170, 185, 145, 95);
		this.add(jl3);

		// 输赢结果显示
		jl4 = new JLabel("");
		jl4.setFont(new java.awt.Font("黑体", Font.BOLD, 30));
		jl4.setBounds(200, 300, 100, 70);
		this.add(jl4);

		// 按钮
		Font f = new Font("黑体", 0, 18);// 设置按钮字体
		final JButton btn = new JButton("石头");
		btn.setFont(f);
		btn.setBounds(380, 60, 70, 60);
		this.add(btn);

		final JButton btn1 = new JButton("剪刀");
		btn1.setFont(f);
		btn1.setBounds(380, 160, 70, 60);
		this.add(btn1);

		final JButton btn2 = new JButton("布");
		btn2.setFont(f);
		btn2.setBounds(380, 260, 70, 60);
		this.add(btn2);

		// 按钮事件监听
		btn.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent arg0) {
				// 如果你鼠标点击的是石头按钮
				i = 0;
				String b = btn.getActionCommand();
				jl3.setText(b);
				jl3.setIcon(new ImageIcon("st.png"));
				socket();
				// Server.this.jl2.setIcon(new ImageIcon(c));
			}
		});
		btn1.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent arg0) {
				i = 1;
				String b1 = btn1.getActionCommand();
				jl3.setText(b1);
				jl3.setIcon(new ImageIcon("jd.png"));
				socket();
				// Server.this.jl2.setIcon(new ImageIcon(c));
			}
		});
		btn2.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent arg0) {
				i = 2;
				String b2 = btn2.getActionCommand();
				jl3.setText(b2);
				jl3.setIcon(new ImageIcon("b.png"));
				socket();
				// Server.this.jl2.setIcon(new ImageIcon(c));
			}
		});
		this.setVisible(true);// 使窗口可见
		this.setDefaultCloseOperation(EXIT_ON_CLOSE);
		this.setLocationRelativeTo(null);// (Component c)设置窗口相对于指定组件的位置。
		                                 // 如果组件当前未显示,或者 c 为 null,则此窗口将置于屏幕的中央
		this.setResizable(false);// 使其不可最大化
	}

	public void socket() {
		InputStream is = null;
		InputStreamReader isReader = null;
		BufferedReader br = null;
		OutputStream os = null;
		PrintWriter pw = null;
		try {
			ServerSocket serverSocket = new ServerSocket(8888);
			Socket socket = serverSocket.accept();
			// 获取输出流
			os = socket.getOutputStream();
			pw = new PrintWriter(os);
			// XXX
			String t = String.valueOf(i)+  "\n";
			pw.write(t);
			pw.flush();// 刷新缓存
			           // 输入流获取客户端信息
			is = socket.getInputStream();
			isReader = new InputStreamReader(is);
			br = new BufferedReader(isReader);
			String info = null;
			//while (() != null) 
			info = br.readLine();
			{
				int d = Integer.parseInt(info);
				c = arr[d];
				Server.this.jl2.setIcon(new ImageIcon(c));
				if (d == i)
					jl4.setText("平手");
				if (d > i)
					jl4.setText("你输了");
				if (d < i)
					jl4.setText("你赢了");
			}
			Thread.sleep(250);
			socket.shutdownInput();// 关闭输入流
			serverSocket.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public void rungame() {
		ServerJF();
		// XXX delete
		//socket();
	}

	public static void main(String[] args) {
		Server test = new Server();
		test.rungame();
	}
}
baidu_30716467 2015-08-20
  • 打赏
  • 举报
回复
怎么都没人呢
baidu_30716467 2015-08-19
  • 打赏
  • 举报
回复
服务端 import java.awt.Font; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; public class Server extends JFrame { private JLabel jl,jl1,jl2,jl3,jl4; int i; String c=""; final String[]arr=new String[3]; public Server(){ jl=new JLabel(); jl1=new JLabel(); jl2=new JLabel(); jl3=new JLabel(); jl4=new JLabel(); } public void pic(){ arr[0]="st.png";//石头 arr[1]="jd.png";//剪刀 arr[2]="b.png";//布 } public void ServerJF(){ JFrame jf=new JFrame(); this.setSize(500,400); this.setTitle("猜拳游戏"); this.setLayout(null); jl=new JLabel("客户端:"); jl.setFont(new java.awt.Font("黑体",Font.BOLD,20)); jl.setBounds(50,95,150,50); this.add(jl); jl1=new JLabel("服务端:"); jl1.setFont(new java.awt.Font("黑体",Font.BOLD,20)); jl1.setBounds(50,195,150,50); this.add(jl1); //客户端出招的图片 jl2=new JLabel(); jl2.setBounds(170,75,145,95); this.add(jl2); //服务端出招的图片 jl3=new JLabel(); jl3.setBounds(170,185,145,95); this.add(jl3); //输赢结果显示 jl4=new JLabel(""); jl4.setFont(new java.awt.Font("黑体",Font.BOLD,30)); jl4.setBounds(200,300,100,70); this.add(jl4); //按钮 Font f=new Font("黑体",0,18);//设置按钮字体 final JButton btn=new JButton("石头"); btn.setFont(f); btn.setBounds(380,60,70,60); this.add(btn); final JButton btn1=new JButton("剪刀"); btn1.setFont(f); btn1.setBounds(380,160,70,60); this.add(btn1); final JButton btn2 =new JButton("布"); btn2.setFont(f); btn2.setBounds(380,260,70,60); this.add(btn2); //按钮事件监听 btn.addActionListener(new ActionListener(){ @Override public void actionPerformed(ActionEvent arg0){ //如果你鼠标点击的是石头按钮 i=0; String b=btn.getActionCommand(); jl3.setText(b); jl3.setIcon(new ImageIcon("st.png")); socket(); // Server.this.jl2.setIcon(new ImageIcon(c)); } }); btn1.addActionListener(new ActionListener(){ @Override public void actionPerformed(ActionEvent arg0){ i=1; String b1=btn1.getActionCommand(); jl3.setText(b1); jl3.setIcon(new ImageIcon("jd.png")); socket(); // Server.this.jl2.setIcon(new ImageIcon(c)); } }); btn2.addActionListener(new ActionListener(){ @Override public void actionPerformed(ActionEvent arg0){ i=2; String b2=btn2.getActionCommand(); jl3.setText(b2); jl3.setIcon(new ImageIcon("b.png")); socket(); // Server.this.jl2.setIcon(new ImageIcon(c)); } }); this.setVisible(true);//使窗口可见 this.setDefaultCloseOperation(EXIT_ON_CLOSE); this.setLocationRelativeTo(null);//(Component c)设置窗口相对于指定组件的位置。 如果组件当前未显示,或者 c 为 null,则此窗口将置于屏幕的中央 this.setResizable(false);//使其不可最大化 } public void socket(){ InputStream is=null; InputStreamReader isReader=null; BufferedReader br=null; OutputStream os=null; PrintWriter pw=null; try{ ServerSocket serverSocket =new ServerSocket(8888); Socket socket=serverSocket.accept(); //获取输出流 os = socket.getOutputStream(); pw = new PrintWriter(os); String t = String.valueOf(i); pw.write(t); pw.flush();//刷新缓存 //输入流获取客户端信息 is = socket.getInputStream(); isReader = new InputStreamReader(is); br = new BufferedReader(isReader); String info=null; while((info=br.readLine())!=null){ int d=Integer.parseInt(info); c=arr[d]; Server.this.jl2.setIcon(new ImageIcon(c)); if(d==i) jl4.setText("平手"); if(d>i) jl4.setText("你输了"); if(d<i) jl4.setText("你赢了"); } socket.shutdownInput();//关闭输入流 } catch (IOException e) { e.printStackTrace(); } } public void rungame(){ ServerJF(); socket(); } public static void main(String[] args) { Server test = new Server(); test.rungame(); } } 客户端 import java.awt.Font; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.*; import java.net.Socket; import java.net.UnknownHostException; import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.text.AbstractDocument.BranchElement; public class Client extends JFrame{ private JLabel jl,jl1,jl2,jl3,jl4; int i; String c=""; final String[]arr=new String[3]; public void pic(){ arr[0]="st.png";//石头 arr[1]="jd.png";//剪刀 arr[2]="b.png";//布 } public Client(){ jl=new JLabel(); jl1=new JLabel(); jl2=new JLabel(); jl3=new JLabel(); jl4=new JLabel(); } public void ClientJF(){ JFrame jf=new JFrame(); this.setSize(500,400); this.setTitle("猜拳游戏"); this.setLayout(null); jl=new JLabel("服务端:"); jl.setFont(new java.awt.Font("黑体",Font.BOLD,20)); jl.setBounds(50,95,150,50); this.add(jl); jl1=new JLabel("客户端:"); jl1.setFont(new java.awt.Font("黑体",Font.BOLD,20)); jl1.setBounds(50,195,150,50); this.add(jl1); //电脑出招的图片 jl2=new JLabel(); jl2.setBounds(170,75,145,95); this.add(jl2); //人出招的图片 jl3=new JLabel(); jl3.setBounds(170,185,145,95); this.add(jl3); //输赢结果显示 jl4=new JLabel(""); jl4.setFont(new java.awt.Font("黑体",Font.BOLD,30)); jl4.setBounds(200,300,100,70); this.add(jl4); //按钮 Font f=new Font("黑体",0,18);//设置按钮字体 final JButton btn=new JButton("石头"); btn.setFont(f); btn.setBounds(380,60,70,60); this.add(btn); final JButton btn1=new JButton("剪刀"); btn1.setFont(f); btn1.setBounds(380,160,70,60); this.add(btn1); final JButton btn2 =new JButton("布"); btn2.setFont(f); btn2.setBounds(380,260,70,60); this.add(btn2); //按钮事件监听 btn.addActionListener(new ActionListener(){ @Override public void actionPerformed(ActionEvent arg0){ //如果你鼠标点击的是石头按钮 i=0; String b=btn.getActionCommand(); jl3.setText(b); jl3.setIcon(new ImageIcon("st.png")); Client(); // Client.this.jl2.setIcon(new ImageIcon(c)); } }); btn1.addActionListener(new ActionListener(){ @Override public void actionPerformed(ActionEvent arg0){ i=1; String b1=btn1.getActionCommand(); jl3.setText(b1); jl3.setIcon(new ImageIcon("jd.png")); Client(); // Client.this.jl2.setIcon(new ImageIcon(c)); } }); btn2.addActionListener(new ActionListener(){ @Override public void actionPerformed(ActionEvent arg0){ i=2; String b2=btn2.getActionCommand(); jl3.setText(b2); jl3.setIcon(new ImageIcon("b.png")); Client(); // Client.this.jl2.setIcon(new ImageIcon(c)); } }); this.setVisible(true);//使窗口可见 this.setDefaultCloseOperation(EXIT_ON_CLOSE); this.setLocationRelativeTo(null);//(Component c)设置窗口相对于指定组件的位置。 如果组件当前未显示,或者 c 为 null,则此窗口将置于屏幕的中央 this.setResizable(false);//使其不可最大化 } public void Client(){ try { //创建客户端socket; Socket socket =new Socket("localhost",8888); //获取输入流用来读取服务端的响应信息 InputStream is=socket.getInputStream(); BufferedReader br =new BufferedReader(new InputStreamReader(is));//字节流包装为字符流 String info=null; //获取输出流向服务器端发送信息 OutputStream os=socket.getOutputStream();//字节输入流 PrintWriter pw=new PrintWriter(os);//输出流包装为打印流 String t = String.valueOf(i);//将i转为String类型 pw.write(t); pw.flush(); socket.shutdownOutput(); while((info=br.readLine())!=null){ int d=Integer.parseInt(info);//将info转为int 类型用于下面的比较 c=arr[d]; Client.this.jl2.setIcon(new ImageIcon(c)); if(d==i) jl4.setText("平手"); if(d>i) jl4.setText("你输了"); if(d<i) jl4.setText("你赢了"); } pw.close(); os.close(); //关闭资源 br.close(); is.close(); socket.close(); } catch (UnknownHostException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } public void rungame(){ ClientJF(); Client(); } public static void main(String[] args){ Client testClient=new Client(); testClient.rungame(); } } 这两段代码是带了UI界面的。就不能交互了。。求指导啊

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧