3. 请补充下面的Socket通信程序内容:

(1)Socket通信中的服务端程序:ChatServerSocket.java

package naizi;
import java.io.*;
import java.net.*;
public class ChatServerSocket{
private ChatJFrame chatframe; //聊天室的图形用户界面
private ServerSocket server;
private Socket client;
public ChatServerSocket(int port, String name) //约定端口号、网名
{
try {
server = new ServerSocket(port);
client = server.accept();//等待接收客户端的连接申请
BufferedReader cin = new BufferedReader(new InputStreamReader(client.getInputStream()));//获得字符输入流 PrintWriter cout = new PrintWriter(client.getOutputStream(), true);//获得字符输出流 chatframe = new ChatJFrame(name," 服务端端口"+port,cout); String aline = ""; do{ aline = cin.readLine();//从输入流接收数据(读取一行数据) if (aline!=null && !aline.equals("bye")) chatframe.receive(aline); }while (aline!=null && !aline.equals("bye")); chatframe.setWriter(null); cin.close(); cout.close(); client.close(); server.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}//创建服务端Socket对象
}
public static void main(String args[])
{
new ChatServerSocket(2018,"王奕"); //约定端口号,指定网名
}
}

(2)Socket通信中的客户端程序:ChatSocket.java

package naizi;
import java.io.*;
import java.net.*;
public class ChatSocket{
private ChatJFrame chatframe; //聊天室的图形用户界面
private Socket client;
public ChatSocket(String host, int port, String name) //主机名、端口号、网名
{ try {
client = new Socket(host,port);
BufferedReader cin = new BufferedReader(new InputStreamReader(client.getInputStream()));//获得字符输入流 PrintWriter cout = new PrintWriter(client.getOutputStream(),true);//获得字符输出流 chatframe = new ChatJFrame(name,"客户端主机"+host+" 端口"+port,cout); String aline = ""; do{ aline = cin.readLine(); if (aline!=null && !aline.equals("bye")) chatframe.receive(aline); }while (aline!=null && !aline.equals("bye")); chatframe.setWriter(null); cin.close(); cout.close(); client.close();
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}//创建客户端Socket对象向服务端发出连接请求
}
public static void main(String args[])
{
new ChatSocket("localhost",2018,"阮磊"); //指定主机和端口号,指定网名
}
}

(3)聊天框的图形界面程序:ChatJFrame.java

package naizi;
import java.awt.event.*;
import javax.swing.*;
import java.io.*;
@SuppressWarnings("serial")
public class ChatJFrame extends JFrame implements ActionListener
{
private JTextArea text_receiver; //显示对话内容的文本区
private JTextField text_sender; //输入发送内容的文本行
private PrintWriter cout; //字符输出流对象
private String name; //网名 public ChatJFrame(String name, String title, PrintWriter cout) //构造方法
{
super("聊天室 "+name+" "+title);
this.setSize(320,240);
this.setLocation(300,240);
this.setDefaultCloseOperation(EXIT_ON_CLOSE); this.text_receiver = new JTextArea();
this.text_receiver.setEditable(false); //不可编辑
this.getContentPane().add(this.text_receiver); JPanel panel = new JPanel();
this.getContentPane().add(panel,"South");
this.text_sender = new JTextField(12);
panel.add(this.text_sender);
this.text_sender.addActionListener(this); //注册单击事件监听器
JButton button_send = new JButton("发送");
panel.add(button_send);
button_send.addActionListener(this);
JButton button_leave = new JButton("离线");
panel.add(button_leave);
button_leave.addActionListener(this);
this.setVisible(true);
this.setWriter(cout);
this.name = name;
} public ChatJFrame()
{
this("","",null);
}
public void setWriter(PrintWriter cout) //设置字符输出流对象
{
this.cout = cout;
}
public void receive(String message) //显示对方发来的内容
{
text_receiver.append(message+"\r\n");
} public void actionPerformed(ActionEvent e)
{
if (e.getActionCommand()=="离线")
{
if (this.cout!=null)
{
this.cout.println(name+"离线");
this.cout.println("bye");
this.cout = null;
}
text_receiver.append("我离线\n");
}
else //发送
{
if (this.cout!=null)
{
this.cout.println(name+" 说:"+text_sender.getText());
text_receiver.append("我说:"+text_sender.getText()+"\n");
text_sender.setText("");
}
else
text_receiver.append("已离线,不能再发送。\n");
}
}
public static void main(String args[])
{
new ChatJFrame();
}
}

程序运行结果如下展示:

Java第三次作业第三题的更多相关文章

  1. Java第三次作业第五题

    5. [问题描述]Fibonacci序列处理 从文件in.txt中读取第一个数作为Fibonacci数列的开始数n,读取第二个数,作为需要写入的数的个数m. 将从n开始的m个Fibonacci数列写入 ...

  2. Java第三次作业第四题

    4. [问题描述]读取一个文本文件in.txt,然后将这个文件的内容,反序写到另一个文件out.txt中. [输入形式]从文件in.txt中读信息. [输出形式]反序内容写入out.txt文件中. [ ...

  3. 2019寒假训练营第三次作业part2 - 实验题

    热身题 服务器正在运转着,也不知道这个技术可不可用,万一服务器被弄崩了,那损失可不小. 所以, 决定在虚拟机上试验一下,不小心弄坏了也没关系.需要在的电脑上装上虚拟机和linux系统 安装虚拟机(可参 ...

  4. 第三周作业(三)---WordCounter

    需求是这样的.写出一个程序,模仿wc.exe,可以统计出文件的一些信息(比如字符数.单词数目等等) 对于这个程序,我仍然用我从大一学来的C语言写的. 第一步:打开文件 printf("请输入 ...

  5. 第三周作业(三):wc程序

    本程序实现了统计文本档案中,文本单词数.字符数以及行数. 代码如下: #include<stdio.h> #include<stdlib.h> int linestatisti ...

  6. 第三周作业(三)WordCount

    这个程序主要就是统计一下文件中的字符数,单词数以及行数. 我的程序很简单,代码很简短,只实现了书中的基本功能. #include <stdio.h> #include <string ...

  7. 2019北航OO第三单元作业总结

    1.梳理JML语言的理论基础.应用工具链情况 JML基础理论: JML(Java Modeling Language)是用于对Java程序进行规格化设计的一种表示语言.JML是一种行为接口规格语言,基 ...

  8. OO第三单元作业(JML)总结

    OO第三单元作业(JML)总结 目录 OO第三单元作业(JML)总结 JML语言知识梳理 使用jml的目的 jml注释结构 jml表达式 方法规格 类型规格 SMT Solver 部署JMLUnitN ...

  9. OO第三次博客作业--第三单元总结

    一.JML 语言的理论基础及应用工具链 JML 是一种行为接口规格语言,提供了对方法和类型的规格定义手段.通过 JML 和其支持工具,不仅可以基于规格自动构造测试用例,并整合了 SMT Solver ...

随机推荐

  1. 搞懂Go垃圾回收

    本文主要介绍了垃圾回收的概念,Golang GC的垃圾回收算法和工作原理,看完本文可以让你对Golang垃圾回收机制有个全面的理解.由于本人不了解其他语言的GC,并未对比其他语言的垃圾回收算法,需要的 ...

  2. OCP培训 Oracle 12c/18c/19c OCP认证实战培训【送OCP优惠名额】

    一.OCP培训 Oracle 12c/18c/19c OCP认证全套实战培训[送OCP优惠名额],本课程内容 课程目标: 为满足想参加Oracle OCP考证的学员,风哥设计的一套比较全面OCP实战培 ...

  3. Javascript十大排序算法的实现方法

    上一篇中,实现了Javascript中的冒泡排序方法,下面把剩余的九种排序算法实现 选择排序: var array = []; for(var i=0;i<100000;i++){ var x ...

  4. Map集合的遍历(利用entry接口的方式)

    核心思想: 调用map集合中的方法entrySet()将集合中的映射关系存放在Set集合中. 迭代Set集合 获取出的Set集合的元素是映射关系对象 通过映射关系对象方法的getKey(),getVa ...

  5. SpringBoot学习------SpringBoot使用Thymleaf模块访问不了静态页面

    SpringBoot使用Thymleaf模块访问不了静态页面 最近学习SpringBoot的过程中使用了Thymeleaf模块引擎,页面发送请求后老是无法显示静态页面,所有的步骤都是参考资料来执行,自 ...

  6. 2017版 Jetbrains 系列软件激活方法

    1. 到网站 http://idea.lanyus.com/ 获取注册码. 2.填入下面的license server: http://intellij.mandroid.cn/ http://ide ...

  7. 2018年蓝桥杯b组国赛真题

    1.标题:换零钞x星球的钞票的面额只有:100元,5元,2元,1元,共4种.小明去x星旅游,他手里只有2张100元的x星币,太不方便,恰好路过x星银行就去换零钱.小明有点强迫症,他坚持要求200元换出 ...

  8. Redis----NoSql数据库笔记

    介绍:Redis 是一个开源的使用 ANSI C 语言编写.遵守 BSD 协议.支持网络.可基于内存亦可持久化的日志型.Key-Value 数据库,并提供多种语言的 API的非关系型数据库. 传统数据 ...

  9. vs2019+cmake实现Linux远程开发

    在上一篇文章中我们介绍了使用vs2019作为远程Linux系统的开发环境,但我们是创建的传统的sln项目,而对于Linux开发者来说以autotools或是cmake进行项目结构的组织更为简单直观,也 ...

  10. cogs 2652. 秘术「天文密葬法」(0/1分数规划 长链剖分 二分答案 dp

    http://cogs.pro:8080/cogs/problem/problem.php?pid=vSXNiVegV 题意:给个树,第i个点有两个权值ai和bi,现在求一条长度为m的路径,使得Σai ...