java掷骰子游戏联机版

目前只实现了一个人的客户端,由服务端进行判断输赢,返回结果!人数,可以自行增加!

我使用多线程的方式,即每次押注都会通知服务器端新开线程,在参与人数比较少的情况下,不会又问题!但是如果参与人数比较多,由于我的基准值,也就是初始金钱值使用的是同一个静态变量,必然有可能会造成金钱变化的不及时,并且,所有人用的也都是同一个金钱值,当然也不太合理!

还有许多控件的功能并没有完全实现!

总算是完成了自己的第一个GUI程序吧!

java 的学习至此也要告一段落了,下一阶段该学什么呢?

//客户端
package cgame;
import java.awt.*;
import java.awt.event.*;

public class ClientGame extends Frame implements WindowListener{
	
	public TextArea ta;
	public ClientGame(){
		super("骰子游戏客户端");
		MenuUI bar=new MenuUI(this);//设置框架菜单栏
		//注册时间监听//第一个this表示自己,给自己注册监听器,是谁,还是自己(第二个this)
		//注册监听器的意思就是说,被监听对象有动作时,自动执行监听器的对应函数
		this.addWindowListener(this);
		//设置主界面
		initUI();
		this.setSize(400,400);
		this.setVisible(true);
	}
	private void initUI(){
		//初始化上部
		Panel pNorth=initNorth();
		this.add(pNorth,BorderLayout.NORTH);
		//初始化右侧
		Panel pEast=initEast();
		this.add(pEast, BorderLayout.EAST);
		//初始化中部
		Panel pCenter=initCenter();
		this.add(pCenter, BorderLayout.CENTER);
	}
	//初始化上部函数,返回上部面板
	private Panel initNorth(){
		Panel p=new Panel();//新建一个面板对象
		//设置布局管理器
		BorderLayout b1=new BorderLayout();
		p.setLayout(b1);
		//创建控件
		Label lbTitle=new Label("欢迎加入骰子大战");
		//添加一个多行文本空间
		ta=new TextArea();//换成类属性,这个每个版块都可以调用了
		ta.append("系统提示信息:\n");
		ta.append("初始金钱:1000\n");
		//设置不可编辑
		ta.setEditable(false);
		//添加到容器
		p.add(lbTitle,BorderLayout.NORTH);
		p.add(ta,BorderLayout.CENTER);
		//设置背景色
		p.setBackground(Color.GRAY);
		return p;
	}
	//初始化右侧函数,返回右侧面板
	private Panel initEast(){
		Panel p=new Panel();
		//设置布局管理器为边界式
		BorderLayout bl=new BorderLayout();
		p.setLayout(bl);
		//创建控件
		Label lbTitle=new Label("当前在线:");
		List listUser=new List();
		listUser.add("所有人");
		listUser.add("Tom");
		listUser.add("Mike");
		//添加控件到容器
		p.add(lbTitle, BorderLayout.NORTH);
		p.add(listUser,BorderLayout.CENTER);
		//设置背景色
		p.setBackground(Color.CYAN);
		return p;
	}
	//初始化中部函数,返回中部面板
	private Panel initCenter(){
		Panel p=new Panel();
		//设置布局管理器
		GridLayout gl=new GridLayout(4,4);
		p.setLayout(gl);
		//创建控件对象,并依次添加
		String[] content={
				"回显功能","200","192.168.1.108","Txt3",
				"回显功能","Label1","Label2","Label3",
				"Label4","Label5","Label6","Label7",
				"压大","压小","聊天","Button3",
		};
		//为了方便调用标签组件,构造Label组件放在构造txt前面
			Label[] DicNum=new Label[8];
			int j=0;
			for(int i=4;i<12;i++,j++){
				DicNum[j]=new Label(content[i]);
				p.add(DicNum[j]);
			}
		//构造Txt组件
		TextField[] userIP=new TextField[4];
		for(int i=0;i<4;i++){
			userIP[i]=new TextField(content[i]);
			p.add(userIP[i]);
		}
		//注册Text0的监视器,这里实际是userIP[0]
		TextToLabel ttl=new TextToLabel(userIP[0],DicNum[0],ta);//将事件源文本框传过去
		userIP[0].addActionListener(ttl);
		
		//构造 button组件
		j=0;
		Button[] btn=new Button[4];//这里仅仅只是声明,还不算初始化
		for(int i=12;i<16;i++,j++){
			btn[j]=new Button(content[i]);
			p.add(btn[j]);
		}
		//为压大和压小按钮注册监听器,将文本框1都传过去,按钮和多行文本控件也要传过去
		//文本框1押注金额0-3,传递的参数:文本框1:输押注金额,文本框2:输ip,
		//按钮:压大小,多行文本:显示提示
		DicGame dg=new DicGame(userIP[1],userIP[2],btn[0],btn[1],ta);
		btn[0].addActionListener(dg);
		btn[1].addActionListener(dg);
		btn[2].addActionListener(dg);
		
		return p;
	}
	public static void main(String[] args) {
		// TODO 自动生成的方法存根
		ClientGame ss=new ClientGame();
	}
	@Override
	public void windowActivated(WindowEvent arg0) {
		// TODO 自动生成的方法存根
		
	}
	@Override
	public void windowClosed(WindowEvent arg0) {
		// TODO 自动生成的方法存根
		
	}
	@Override
	public void windowClosing(WindowEvent arg0) {
		// TODO 自动生成的方法存根
		System.exit(0);
		
	}
	@Override
	public void windowDeactivated(WindowEvent arg0) {
		// TODO 自动生成的方法存根
		
	}
	@Override
	public void windowDeiconified(WindowEvent arg0) {
		// TODO 自动生成的方法存根
		
	}
	@Override
	public void windowIconified(WindowEvent arg0) {
		// TODO 自动生成的方法存根
		
	}
	@Override
	public void windowOpened(WindowEvent arg0) {
		// TODO 自动生成的方法存根
		
	}
	

}
package cgame;
import java.awt.*;
import java.util.*;
import java.awt.event.*;
import java.io.*;
import java.net.*;
public class DicGame implements ActionListener {

	Label lab1;
	TextArea ta;
	TextField txt1,txt2;//txt1用于押注金额,txt2用于输入ip
	Button btn0,btn1,btn2;
	static int money=1000;//初始金额
	public DicGame(TextField txt1,TextField txt2,Button btn0,Button btn1,TextArea ta){
		this.txt1=txt1;
		this.txt2=txt2;
		this.btn0=btn0;
		this.btn1=btn1;
		this.btn2=btn2;
		this.ta=ta;
	}

	@Override
	public void actionPerformed(ActionEvent e) {
		// TODO 自动生成的方法存根
		
		Socket socket=null;//客户端 声明网络连接对象
		InputStream is=null;
		OutputStream os=null;
		//服务器端IP地址在txt2中,通过函数来得到
		String serverIP=addIP(txt2);
		//服务器端口号
		int port=10000;
		//发送内容就限定为byte型的0和1,压大是1,压小是0
		//两个按钮注册的是同一个监听对象,就需要得到事件源,判断是哪个按钮事件
		String data=null;
		Button b=(Button)e.getSource();
		if(b==btn0)
			data="1";//压大
		else if(b==btn1)
			data="0";//压小

		//获得押注金额,txt1内容转换为字符串
		String stake=txt1.getText();
		
		//将多个String连接成一个字符串,大小和押注金额
		String sdata=linkData(data,stake);
		showLabel(sdata);
		try{
			//建立连接
			socket=new Socket(serverIP,port);
			//发送数据
			//就简单理解为,此操作后,os就是连接输出流,输出内容写入到输出流os中即可
			os=socket.getOutputStream();//得到网络连接的输出流
			os.write(sdata.getBytes());
			//接受数据
			is=socket.getInputStream();//同上理解,得到连接输入流
			byte[]d=new byte[1024];
			int n=is.read(d);
			//输出反馈数据
			String s=new String(d,0,n);//反馈数据即为此s字符串
			showLabel(s);
			//解析s字符串,并输出结果
			showResult(s);
			
			
		}catch(Exception e1){
			e1.printStackTrace();
		}finally{
			try{
				//关闭流和连接
				is.close();
				os.close();
				socket.close();
			}catch(Exception e2){}
		}

	}
	String addIP(TextField txt2){
		return txt2.getText();//这里对IP地址的非法情况不做判断,由连接异常来反应
	}
	//将发送数据都整合到一个字符串里面
	String linkData(String str1,String str2){
		//StringBuffer sb=new StringBuffer(str1);
		//sb.append(str2);
		return str1+" "+str2;//String本来就重载了+,可以直接使用
	}
	//反馈数据解析并显示函数
	void showResult(String s){
		StringTokenizer an=new StringTokenizer(s," ");//空格作为分隔依据
		
			String str1=an.nextToken();
			String str2=an.nextToken();//我这种简单的网络协议就不需要用循环了
			//数据解析完成后显示
			showLabel(str1);showLabel("显示么?");
			if(str1=="0"){
				showLabel("输");
			}else {
				showLabel("赢");
			}
			showLabel("剩余金钱:");
			showLabel(str2);
			
	}
	//将字符串在多行文本上显示
	public void showLabel(String s){
		ta.append(s+'\n');
	}
	
}
package cgame;
import java.awt.*;
import java.awt.event.*;
import javax.swing.JOptionPane;

public class MenuUI implements ActionListener {
		MenuItem versionMi;
		MenuItem authorMi;
		Frame frm;
	public MenuUI(Frame frm){
		this.frm=frm;//传递框架对象,不然弹出对话框的时候,找不到依赖对话框
		MenuBar bar=new MenuBar();//创建菜单栏
		//创建菜单
		Menu fileMenu=new Menu("文件");
		Menu helpMenu=new Menu("帮助");
		Menu aboutMenu=new Menu("关于");
		//创建菜单项
		MenuItem openMi=new MenuItem("打开");
		MenuItem printMi=new MenuItem("打印");
		MenuItem exitMi=new MenuItem("退出");
		MenuItem helpMi=new MenuItem("帮助");
		versionMi=new MenuItem("版本");
		authorMi=new MenuItem("作者");
		//添加到菜单
		fileMenu.add(openMi);
		fileMenu.add(printMi);
		fileMenu.add(exitMi);
		aboutMenu.add(versionMi);
		aboutMenu.add(authorMi);
		helpMenu.add(helpMi);
		helpMenu.add(aboutMenu);
		//添加到菜单栏
		bar.add(fileMenu);
		bar.add(helpMenu);
		//设置菜单栏
		frm.setMenuBar(bar);
		//注册同一个监听器,方法内部判断发生事件的菜单项,然后进行不同的逻辑处理 
		versionMi.addActionListener(this);
		authorMi.addActionListener(this);
	}
	public void actionPerformed(ActionEvent e){
		//获得发生事件的控件
		MenuItem mi=(MenuItem)e.getSource();
		//判断,弹出有模式对话框
		if(mi==versionMi){
			JOptionPane.showMessageDialog(frm, "v1.2\n单机掷骰子","版本", JOptionPane.INFORMATION_MESSAGE);
		}
		else if(mi==authorMi){
			JOptionPane.showMessageDialog(frm, "Andy\n座右铭:勤耕不辍,方得始终!","作者", JOptionPane.INFORMATION_MESSAGE);
		}
	}
}
package cgame;
import java.awt.*;
import java.awt.event.*;
public class TextToLabel implements ActionListener {

	TextField txt1;
	Label Lab1;
	TextArea ta;
	//构造方法要将事件源文本框传过来
	public TextToLabel(TextField txt1,Label Lab1,TextArea ta){
		this.txt1=txt1;
		this.Lab1=Lab1;
		this.ta=ta;
	}
	@Override
	public void actionPerformed(ActionEvent e) {
		// TODO 自动生成的方法存根
		String word=txt1.getText();//获得输入文本
		Lab1.setText(word);
		ta.append(word+'\n');
		System.out.println(word);
	}

}
//*********************************************************
//服务器端
package sgame;
import java.awt.*;
import java.awt.event.*;
public class DicGame implements ActionListener {

	Label lab1;
	TextArea ta;
	TextField txt2;
	Button btn0,btn1;
	static int money=1000;//初始金额
	public DicGame(TextField txt2,Label lab1,Button btn0,Button btn1,TextArea ta){
		this.lab1=lab1;
		this.txt2=txt2;
		this.btn0=btn0;
		this.btn1=btn1;
		this.ta=ta;
	}

	@Override
	public void actionPerformed(ActionEvent e) {
		// TODO 自动生成的方法存根
		
		//showLabel(changeChar(money),ta);//显示初始金额
		int diceNum=0;
		int type=0;
		//判断押宝类型
		//获得按钮对象
		Button b=(Button)e.getSource();
		if(b==btn0)
			type=1;//1压大
		else if(b==btn1)
			type=2;//2压小
		int cMoney=changeInt();
		boolean success;
		//游戏过程,应该是不需要死循环的
		//输入非法,则程序直接完成了,GUI线程本身是死循环了,输入正确执行else
		if(!checkCMoney(money,cMoney)){
			showLabel("输入非法",ta);
		}
		//输入有效后,开始掷骰子
		else {
			diceNum=doDice();//掷骰子
			//判断胜负
			success=isSuccess(type,diceNum);
			//金钱变化
			money=changeMoney(money,success,cMoney);
			//游戏结束
			if(money<=0){
				showLabel("请充值!",ta);
			}
		}
			

	}
	//定义一个将整形转换为字符串的函数
	public String changeChar(int i){
		return Integer.toString(i);
	}
	//将字符串在多行文本上显示
	public void showLabel(String s,TextArea ta){
		ta.append(s+'\n');
	}
	//将文本框获得内容转为整形数
	public int changeInt(){
		String s=txt2.getText();
		return Integer.parseInt(s);
	}
	//判定下注金额是否非法
	public static boolean checkCMoney(int money,int cMoney){
		
		if(cMoney<=0)
			return false;
		else if(cMoney<=money)
			return true;
		else
			return false;
	}
	//掷骰子,返回点数和
	public static int doDice(){
		int n=(int)(Math.random()*6)+1;
		int n1=(int)(Math.random()*6)+1;
		int n2=(int)(Math.random()*6)+1;
		return n+n1+n2;
	}
	//胜负判断
	public  boolean isSuccess(int type,int diceNum){
		//计算庄家类型
		int bankerType=0;
		if(diceNum<=9){
			bankerType=2;
		}else{
			bankerType=1;
		}
		if(bankerType==type){
			showLabel("赢",ta);
			return true;
		}
		else{
			showLabel("输",ta);
			return false;
		}
	}
	//金钱变化
	public int changeMoney(int money,boolean success,int cMoney){
		if(success){
			money+=cMoney;
		}else{
			money-=cMoney;
		}
		showLabel("当前金钱:",ta);
		showLabel(changeChar(money),ta);
		return money;
	}
}
package sgame;
import java.awt.*;
import java.io.*;
import java.net.*;
import java.util.*;
public class LogicThread extends Thread {
	Socket socket;
	TextArea ta;
	InputStream is;
	OutputStream os;
	int dicNum,result,nowMoney;//返回结果为result nowMoney
	public LogicThread(Socket socket,TextArea ta){
		this.socket=socket;
		this.ta=ta;
		start();
	}
	public void run(){
		byte[]b=new byte[1024];
		try{
			//得到连接中的输入输出流
			os=socket.getOutputStream();
			is=socket.getInputStream();
			//读取数据
			int n=is.read(b);
			//逻辑处理
			String str=sHandle(b,n);//n代表实际读取字节数
			//发送str内容
			os.write(str.getBytes());
			ta.append("&&&&&&&&");
			ta.append(str);
			System.out.println("&*&*&*线程到这里就该结束了");
		}catch(Exception e){
			e.printStackTrace();
		}finally{
			close();
		}
	}
	//关闭流和连接
	private void close(){
		try{
			//关闭流和连接
			System.out.println("&*&*&*&*&*");
			os.close();
			is.close();
			socket.close();
		}catch(Exception e){}
	}
	//逻辑处理函数
	String sHandle(byte[] b,int n){
		//首先要将b数组解析出来
		String str=new String(b,0,n);//将字节数组转换为字符串
		ta.append(str+'\n');
		StringTokenizer ad=new StringTokenizer(str," ");//空格分隔
		String str1=ad.nextToken();//实际则代表了客户端发来的压大小信息
		String str2=ad.nextToken();//代表客户所押金额
		ta.append("********");
		ta.append(str1+'\n');
		ta.append(str2+'\n');
		//判断客户所押为大还是小,并得到押注金额,将字符串转变为整型数
		int type=Integer.parseInt(str1);
		int cMoney=Integer.parseInt(str2);
		System.out.println(type);
		System.out.println(cMoney);
		ta.append("*********");
		//判断押注金额是否非法,调用DicGame类中的静态变量和方法
		boolean success;
		System.out.println("静态变量金钱:"+DicGame.money);
		if(!DicGame.checkCMoney(DicGame.money,cMoney)){
			ta.append("输入非法");//将字符串在多行文本空间中显示
			result=0;
			nowMoney=DicGame.money;
			}
			else{//输入有效开始判断大小
				dicNum=DicGame.doDice();
				//判断胜负
				success=isSuccess(type,dicNum);
				//金钱变化,这里金钱使用的是静态变量,但是还是值传递的方式,
				//每次不管怎么变,原来的静态变量没有变,所以总是以1000为基准
				nowMoney=changeMoney(DicGame.money,success,cMoney);
				//游戏结束
				if(nowMoney<=0)
					ta.append("请充值!\n");
			}
		//游戏至此就已经完成,转换要返回的数据并返回
		return Integer.toString(result)+" "+Integer.toString(nowMoney);
		
	}
	//胜负判断
		public  boolean isSuccess(int type,int dicNum){
			//计算庄家类型
			int bankerType=0;
			if(dicNum<=9){
				bankerType=0;
			}else{
				bankerType=1;
			}
			if(bankerType==type){
				ta.append("赢\n");
				result=1;
				return true;
			}
			else{
				ta.append("输\n");
				result=0;
				return false;
			}
		}
		//金钱变化
		public int changeMoney(int money,boolean success,int cMoney){
			if(success){
				money+=cMoney;
			}else{
				money-=cMoney;
			}
			System.out.println("变化后的金钱:");
			System.out.println(money);
			ta.append("剩余金钱:\n");;
			//将剩余金钱转换为字符串并显示
			ta.append(Integer.toString(money));
			DicGame.money=money;//金钱变化后,要修改基准值
			return money;
		}
}
package sgame;
import java.awt.*;
import java.awt.event.*;
import javax.swing.JOptionPane;

public class MenuUI implements ActionListener {
		MenuItem versionMi;
		MenuItem authorMi;
		Frame frm;
	public MenuUI(Frame frm){
		this.frm=frm;//传递框架对象,不然弹出对话框的时候,找不到依赖对话框
		MenuBar bar=new MenuBar();//创建菜单栏
		//创建菜单
		Menu fileMenu=new Menu("文件");
		Menu helpMenu=new Menu("帮助");
		Menu aboutMenu=new Menu("关于");
		//创建菜单项
		MenuItem openMi=new MenuItem("打开");
		MenuItem printMi=new MenuItem("打印");
		MenuItem exitMi=new MenuItem("退出");
		MenuItem helpMi=new MenuItem("帮助");
		versionMi=new MenuItem("版本");
		authorMi=new MenuItem("作者");
		//添加到菜单
		fileMenu.add(openMi);
		fileMenu.add(printMi);
		fileMenu.add(exitMi);
		aboutMenu.add(versionMi);
		aboutMenu.add(authorMi);
		helpMenu.add(helpMi);
		helpMenu.add(aboutMenu);
		//添加到菜单栏
		bar.add(fileMenu);
		bar.add(helpMenu);
		//设置菜单栏
		frm.setMenuBar(bar);
		//注册同一个监听器,方法内部判断发生事件的菜单项,然后进行不同的逻辑处理 
		versionMi.addActionListener(this);
		authorMi.addActionListener(this);
	}
	public void actionPerformed(ActionEvent e){
		//获得发生事件的控件
		MenuItem mi=(MenuItem)e.getSource();
		//判断,弹出有模式对话框
		if(mi==versionMi){
			JOptionPane.showMessageDialog(frm, "v1.2\n单机掷骰子","版本", JOptionPane.INFORMATION_MESSAGE);
		}
		else if(mi==authorMi){
			JOptionPane.showMessageDialog(frm, "Andy\n座右铭:勤耕不辍,方得始终!","作者", JOptionPane.INFORMATION_MESSAGE);
		}
	}
}
package sgame;
import java.awt.*;
import java.net.*;
import java.awt.event.*;

public class ServiceGame extends Frame implements WindowListener{
	
	static public TextArea ta;//设置为公共属性,大家都可以调用来显示提示信息
	public ServiceGame(){
		super("骰子游戏服务端");
		MenuUI bar=new MenuUI(this);//设置框架菜单栏
		//注册时间监听//第一个this表示自己,给自己注册监听器,是谁,还是自己(第二个this)
		//注册监听器的意思就是说,被监听对象有动作时,自动执行监听器的对应函数
		this.addWindowListener(this);
		//设置主界面
		initUI();
		this.setSize(400,400);
		this.setVisible(true);
	}
	private void initUI(){
		//初始化上部
		Panel pNorth=initNorth();
		this.add(pNorth,BorderLayout.NORTH);
		//初始化右侧
		Panel pEast=initEast();
		this.add(pEast, BorderLayout.EAST);
		//初始化中部
		Panel pCenter=initCenter();
		this.add(pCenter, BorderLayout.CENTER);
	}
	//初始化上部函数,返回上部面板
	private Panel initNorth(){
		Panel p=new Panel();//新建一个面板对象
		//设置布局管理器
		BorderLayout b1=new BorderLayout();
		p.setLayout(b1);
		//创建控件
		Label lbTitle=new Label("欢迎加入骰子大战");
		//添加一个多行文本空间
		ta=new TextArea();//换成类属性,这个每个版块都可以调用了
		ta.append("系统提示信息:\n");
		ta.append("初始金钱:1000\n");
		//设置不可编辑
		ta.setEditable(false);
		//添加到容器
		p.add(lbTitle,BorderLayout.NORTH);
		p.add(ta,BorderLayout.CENTER);
		//设置背景色
		p.setBackground(Color.GRAY);
		return p;
	}
	//初始化右侧函数,返回右侧面板
	private Panel initEast(){
		Panel p=new Panel();
		//设置布局管理器为边界式
		BorderLayout bl=new BorderLayout();
		p.setLayout(bl);
		//创建控件
		Label lbTitle=new Label("当前在线:");
		List listUser=new List();
		listUser.add("所有人");
		listUser.add("Tom");
		listUser.add("Mike");
		//添加控件到容器
		p.add(lbTitle, BorderLayout.NORTH);
		p.add(listUser,BorderLayout.CENTER);
		//设置背景色
		p.setBackground(Color.CYAN);
		return p;
	}
	//初始化中部函数,返回中部面板
	private Panel initCenter(){
		Panel p=new Panel();
		//设置布局管理器
		GridLayout gl=new GridLayout(4,4);
		p.setLayout(gl);
		//创建控件对象,并依次添加
		String[] content={
				"Txt1","Txt2","Txt3","Txt4",
				"Label1","Label2","Label3","Label4",
				"Label5","Label6","Label7","Label8",
				"压大","压小","Button3","Button4",
		};
		//为了方便调用标签组件,构造Label组件放在构造txt前面
			Label[] DicNum=new Label[8];
			int j=0;
			for(int i=4;i<12;i++,j++){
				DicNum[j]=new Label(content[i]);
				p.add(DicNum[j]);
			}
		//构造Txt组件
		TextField[] userIP=new TextField[4];
		for(int i=0;i<4;i++){
			userIP[i]=new TextField(content[i]);
			p.add(userIP[i]);
		}
		//注册Text1的监视器,这里实际是userIP[0]
		TextToLabel ttl=new TextToLabel(userIP[0],DicNum[0],ta);//将事件源文本框传过去
		userIP[0].addActionListener(ttl);
		
		//构造 button组件
		j=0;
		Button[] btn=new Button[4];//这里仅仅只是声明,还不算初始化
		for(int i=12;i<16;i++,j++){
			btn[j]=new Button(content[i]);
			p.add(btn[j]);
		}
		//为压大和压小按钮注册监听器,将标签2,3,4和文本框1都传过去,按钮也要传过去
		DicGame dg=new DicGame(userIP[1],DicNum[1],btn[0],btn[1],ta);
		btn[0].addActionListener(dg);
		btn[1].addActionListener(dg);
		
		return p;
	}
	public static void main(String[] args) {
		// TODO 自动生成的方法存根
		ServiceGame ss=new ServiceGame();//这一步只是生成了界面
		//就是说只是开启了一个线程来做界面这件事情,主函数,也就是主线程,还要往下执行
		//System.out.println("hello");
		ServerSocket serverSocket=null;
		Socket socket=null;
		//监听端口号
		int port=10000;
		try{
			//建立连接
			serverSocket=new ServerSocket(port);//监听代码
			ta.append("服务器已启动\n");
			int i=1;
			while(i>0){
				//获得连接到服务器端的客户端连接,释放服务器端口,拥塞方法
				socket=serverSocket.accept();
				//启动线程
				System.out.println("线程开始");
				LogicThread tt=new LogicThread(socket,ta);
				System.out.println("第"+i+"次循环");
				i++;
				System.out.println("线程结束了!");
				
			}
	}catch(Exception e){
		e.printStackTrace();
	}finally{
		try{
			//关闭连接
			serverSocket.close();
		}catch(Exception e){}
	}
}
	@Override
	public void windowActivated(WindowEvent arg0) {
		// TODO 自动生成的方法存根
		
	}
	@Override
	public void windowClosed(WindowEvent arg0) {
		// TODO 自动生成的方法存根
		
	}
	@Override
	public void windowClosing(WindowEvent arg0) {
		// TODO 自动生成的方法存根
		System.exit(0);
		
	}
	@Override
	public void windowDeactivated(WindowEvent arg0) {
		// TODO 自动生成的方法存根
		
	}
	@Override
	public void windowDeiconified(WindowEvent arg0) {
		// TODO 自动生成的方法存根
		
	}
	@Override
	public void windowIconified(WindowEvent arg0) {
		// TODO 自动生成的方法存根
		
	}
	@Override
	public void windowOpened(WindowEvent arg0) {
		// TODO 自动生成的方法存根
		
	}
	

}
package sgame;
import java.awt.*;
import java.awt.event.*;
public class TextToLabel implements ActionListener {

	TextField txt1;
	Label Lab1;
	TextArea ta;
	//构造方法要将事件源文本框传过来
	public TextToLabel(TextField txt1,Label Lab1,TextArea ta){
		this.txt1=txt1;
		this.Lab1=Lab1;
		this.ta=ta;
	}
	@Override
	public void actionPerformed(ActionEvent e) {
		// TODO 自动生成的方法存根
		String word=txt1.getText();//获得输入文本
		Lab1.setText(word);
		ta.append(word+'\n');
		System.out.println(word);
	}

}

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值