简单java大作业_一个简单的java大作业2

上文提到,建立了OrderUI,因为餐馆数增加,所以选择参观时,用number表示选择的餐馆编号,在Mypanel类绘制送给哪个餐馆时,只要向那家餐馆方向移动就行。

run方法修改成

while(xg.flag0==0) {try {Thread.sleep(50);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}//改成numberxg.delivey(rest[number].x, rest[number].y);repaint();}

接下来就进行比较重要的一步:给XiaoGe类建立服务端,OrderUI类建立客户端。

先给XiaoGe类添加窗口与文本域,定义多个属性

//自带缓冲区的输入流public BufferedReader reader;//输出流public PrintWriter writer;//发送的信息public String sendmessage;public transient JFrame frame1=new JFrame("风里雨里的小哥");public transient JTextArea text=new JTextArea(20,20);public transient JPanel panel1=new JPanel();//两个按钮 一个发送消息 一个清空文本域public transient JButton button1=new JButton("send");public transient JButton button2=new JButton("clear");//滚动带public transient JScrollPane roll;

在构造方法中添加

frame1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//改变窗口的布局方式frame1.setLayout(new FlowLayout());frame1.setSize(400,400);frame1.setVisible(true);frame1.setBounds(50, 100, 400, 400);//自动换行text.setLineWrap(true);//构造方法的参数为文本域类roll=new JScrollPane(text);//定义垂直滚动roll.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);roll.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);//面板添加的是滚动带panel1.add(roll);//以内部类的方式给按钮注册监听button2.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {// TODO Auto-generated method stub//清空消息栏text.setText("");}});button1.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {// TODO Auto-generated method stub//将文本域中的内容发送出去writer.println(text.getText());//清空输出流writer.flush();text.setText("");text.requestFocus();}});frame1.add(panel1);frame1.add(button2);frame1.add(button1);

启动服务端方法

//开始服务端public void StartKH() {try {//服务端套节字//端口为5056ServerSocket serversock=new ServerSocket(5056);//接受客户端信息while(true) {//有客户才会往下进行 不然会阻塞Socket socket=serversock.accept();System.out.println("连接成功");//输出向客户端writer=new PrintWriter(socket.getOutputStream());//读取客户的线程Thread t=new Thread(new readerCient(socket));t.start();}} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}

不断读取信息的线程(以内部类的方式建立)

//客户端信息要不断读取//所以要建立一个线程实时读取客户端信息class readerCient implements Runnable{//套节子类型Socket socket;boolean volog=true;//判断是否送餐public readerCient(Socket UIsocket){super();try {socket = UIsocket;//装饰模式读取信息reader=new BufferedReader(new InputStreamReader(socket.getInputStream()));} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}@Overridepublic void run(){// TODO Auto-generated method stubString str;//读取信息try {//有信息开始读取 每次读取一行while((str=reader.readLine())!=null) {// System.out.println("开始读取");text.append(str+"\n");//收到消息 向客户端反馈if(volog) {writer.println("我已收到,开始送餐");volog=false;}//必须要加这条语句 不然可能消息发送不成功writer.flush();// System.out.println("服务器发送");}} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}

由于服务端要独立运行,也就是要有自己的main方法,而在Mypanel类中又要获取XiaoGe的位置等信息。所以我想到的解决办法是将XiaoGe类对象序列化,然后在Mypanel类中解序列化(有些不能序列化的类要加transient)。

public static void main(String[] args) {try {//将对象序列化XiaoGe x1=new XiaoGe(50, 60);ObjectOutputStream os=new ObjectOutputStream(new FileOutputStream("ObjectXiaoGe.txt"));os.writeObject(x1);os.close();//开始客户端线程x1.StartKH();} catch (FileNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}

相应的在Mypanel类中解序列化

//读取对象try {FileInputStream file=new FileInputStream("ObjectXiaoGe.txt");ObjectInputStream is = null;if(file.available()!=0) {is=new ObjectInputStream(file);xg=(XiaoGe)is.readObject();}is.close();

给OrderUI搭建客户端

private void KehuStart() {try {//ip地址与端口 端口要和服务端相同//"127.0.0.1"代表本机地址socket=new Socket("127.0.0.1",5056);System.out.println("客户端连接");//装饰模式 接收服务器消息reader=new BufferedReader(new InputStreamReader(socket.getInputStream()));//发送消息到服务端writer=new PrintWriter(socket.getOutputStream());} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}

同时给客户端不断读取的线程

//不断读取线程class InReader implements Runnable{String str;@Overridepublic void run(){// TODO Auto-generated method stubtry {//System.out.println("wohuizhixing");//System.out.println(reader.readLine().isEmpty());while((str=reader.readLine())!=null) {//System.out.println("客服端读取");text.setText(str);//System.out.println("sufferful");}//while语句后的不运行System.out.println("真的会?");} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}

先启动服务端,再启动客户端,顺序反了会报异常。

如果成功了就会显示下图

136be34314a57ba454d97dfa8ef5d707.png

136be34314a57ba454d97dfa8ef5d707.png

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值