团队项目第四周

聊天系统的设计跟普通网站设计有着许多不同的地方,普通网站设计所考虑的因素,例如,普通网站需要对布局进入大量美化以及动画设计等等,而聊天室只要提供满足访客双方直接实时聊天即可。因此,在设计聊天系统的过程中,必须要考虑好以下几个设计要点:

在Internet上的聊天程序一般都是以服务器提供服务端连接响应,使用者通过客户端程序登录到服务器,就可以与登录在同一服务器上的用户交谈,这是一个面向连接的通信过程。因此,程序要在TCP/IP环境下,实现服务器端和客户端两部分程序。

1.首先通过继承JFrame类构造服务器界面。

2.设计客户端程序使其能够完成正常的通信功能

3.设计侦听程序,使其显示登录的ip地址端口号,以及用户昵称,通过侦听按钮可以调用客户端程序,实现聊天功能。

以下为源代码:

(1)ActionProcess.java

package chat;

import java.awt.event.ActionEvent;

import java.io.DataInputStream;

import java.io.DataOutputStream;

import java.io.IOException;

import java.net.*;

import javax.swing.JOptionPane;

public class ActionProcess implements Runnable {

private ChatClient client;

String name="";

String sendtoname="";

String sendtoID;

String filename="";

String filepath="";

public ActionProcess(ChatClient client) {

this.client=client;

}

public void action(ActionEvent e)throws Exception{

if(e.getSource()==client.connection)

{

try

{

if(client.socket.isConnected()){}

else

{

String addr=JOptionPane.showInputDialog("请输入服务器IP:");

InetAddress address=InetAddress.getByName(addr);

InetSocketAddress  socketAddress=new  InetSocketAddress(address,5555);

client.socket.connect(socketAddress);

client.in=new DataInputStream(client.socket.getInputStream());

client.out=new DataOutputStream(client.socket.getOutputStream());

name=client.inputName.getText();

client.out.writeUTF("姓名为"+name+"的朋友风尘仆仆地上线了...");

client.listen.setEnabled(true);

client.filesend.setEnabled(true);

client.sendtoall.setEnabled(true);

client.sendtoone.setEnabled(true);

client.emote.setEnabled(true);

if(!(client.thread.isAlive()))

client.thread=new Thread(this);

client.thread.start();

}

}

catch(IOException ee){}

}

if(e.getSource()==client.listen)

{

try

{

name=client.inputName.getText();

client.out.writeUTF("姓名为"+name+"的朋友正在监听中...");

filesendServer filesendserver=new filesendServer();

filesendserver.filereceive();

}

catch (Exception ee) {

ee.printStackTrace();

}

}

if(e.getSource()==client.filesend){

if(client.socket.isConnected())

try {

filesendClient filesendclient=new filesendClient();

filesendclient.filesend();

client.out.writeUTF("成功发送文件!");

}catch (Exception ee){}

}

if(e.getSource()==client.exit)

{

if(client.socket.isConnected())

try {

name=client.inputName.getText();

client.out.writeUTF("姓名为"+name+"的朋友黯然下线了...");

client.out.flush();

client.out.close();

client.socket.close();

} catch (IOException e1) {

e1.printStackTrace();

}

System.exit(0);

}

String em=client.emote.getSelectedItem().toString();

if (em.equals("表情")) {

em = "";

} else {

em += "着";

}

if(e.getSource()==client.sendtoall)

{

if(client.socket.isConnected()){

name=client.inputName.getText();

String s=client.inputContent.getText();

if(s!=null)

{

try

{

client.out.writeUTF(name+em+"对大家说:"+s);

client.out.flush();

client.inputContent.setText("");

}

catch(IOException e1){}

}

}

}

if(e.getSource()==client.sendtoone)

{

if(client.socket.isConnected()){

sendtoID=JOptionPane.showInputDialog("请输入对方ID:");

sendtoname=JOptionPane.showInputDialog("请输入对方姓名:");

String s=client.inputContent.getText();

name=client.inputName.getText();

if(s!=null)

{

try

{

client.out.writeUTF(name+" 悄 悄 地 "+em+" 对 <"+sendtoID+">"+sendtoname+"说:"+s);

client.out.flush();

client.inputContent.setText("");

}

catch(IOException e1){}

}

}

}

}

public void run()

{

String s=null;

while(true)

{

try

{

s=client.in.readUTF();

client.chatResult.append("\n"+s);

}

catch(IOException e)

{

client.chatResult.setText("与服务器断开连接");

try

{

client.socket.close();

}

catch(Exception ep){}

break;

}

}

}

}

(2)Clicent.java

package chat;

import java.awt.*;

import java.io.*;

import java.net.*;

import java.awt.event.*;

import javax.swing.*;

public class Client {

public static void main(String args[])

{

new ChatClient();

}

}

class ChatClient extends Frame implements ActionListener, Runnable{

private static final long serialVersionUID = -4149839042245330513L;

public Button listen,connection,sendtoall,sendtoone,exit,filesend;

public JComboBox emote;

public TextField inputName,inputContent;

public TextArea chatResult;

public Socket socket=null;

public DataInputStream in=null;

public DataOutputStream out=null;

public Thread thread;

ChatClient()

{

socket=new Socket();

Box box1=Box.createHorizontalBox();

listen=new Button("作为服务器监听");

connection=new Button("连接服务器");

filesend=new Button("发送文件");

exit=new Button("退出");

sendtoall=new Button("群聊");

sendtoone=new Button("私聊");

listen.setEnabled(false);

filesend.setEnabled(false);

sendtoall.setEnabled(false);

sendtoone.setEnabled(false);

inputName=new TextField(6);

inputName.setBackground(new Color(162,231,250));

inputContent=new TextField(22);

inputContent.setBackground(new Color(162,231,250));

chatResult= new TextArea("", 17,20,TextArea.SCROLLBARS_VERTICAL_ONLY);

chatResult.setBackground(new Color(162,231,250));

JLabel jlname=new JLabel("输入昵称");

box1.add(jlname);

box1.add(inputName);

box1.add(listen);

box1.add(connection);

box1.add(filesend);

box1.add(exit);

Box box2=Box.createHorizontalBox();

emote = new JComboBox();

emote.setModel(new DefaultComboBoxModel(new String[] { "表情", "微笑", "甜笑", "惊喜", "嘻嘻", "扮酷", "嘿嘿", "傻笑", "好奇", "媚眼", "鬼脸", "陶醉", "害羞", "生气", "嚷嚷", "发怒", "伤心", "高明", "菜鸟", "问号", "狂笑", "大哭", "示爱", "呻吟", "想想" }));

emote.setEnabled(false);

JLabel jlintput = new JLabel("输入聊天内容");

box2.add(jlintput);

box2.add(inputContent);

box2.add(emote);

box2.add(sendtoall);

box2.add(sendtoone);

listen.addActionListener(this);

connection.addActionListener(this);

filesend.addActionListener(this);

exit.addActionListener(this);

sendtoall.addActionListener(this);

sendtoone.addActionListener(this);

Box box3=Box.createHorizontalBox();

box3.add(chatResult);

thread=new Thread(this);

Box box0=Box.createVerticalBox();

box0.add(Box.createVerticalStrut(10));

box0.add(box1);

box0.add(Box.createVerticalStrut(10));

box0.add(box3);

box0.add(Box.createVerticalStrut(10));

box0.add(box2);

box0.add(Box.createVerticalStrut(10));

add(box0);

setBounds(10,30,500,400);

setBackground(new Color(80,212,248));

setVisible(true);

validate();

addWindowListener(new WindowAdapter(){

public void windowClosing(WindowEvent e){

System.exit(0);

try {

socket.close();

} catch (IOException e1) {

e1.printStackTrace();

}

}

});

}

public void actionPerformed(ActionEvent e) {

ActionProcess actionProcess=new ActionProcess(this);

try {

actionProcess.action(e);

} catch (Exception e1) {

e1.printStackTrace();

}

}

public void run()

{

String s=null;

while(true) {

try

{

s=in.readUTF();

chatResult.append("\n"+s);

}

catch(IOException e)

{

chatResult.setText("与服务器断开连接");

try

{

socket.close();

}  catch(Exception ep){}

break;

}

}

}

}

(3)ChatServer.java

package chat;

import java.net.*;

import java.io.*;

import java.util.*;

public class ChatServer

{

public static void main(String[] args)throws Exception{

ServerSocket svSocket =null;

Vector threads = new Vector();

try {

svSocket = new ServerSocket(5555);

System.out.println ("listening...");

}catch (Exception ex) {

System.out.println ("Server create ServerSocket failed!");

return;

}

try{

int nid = 0;

while(true){

Socket socket = svSocket.accept();

System.out.println ("accept a client");

ServerThread st = new ServerThread(socket,threads);

st.setID(nid++);

threads.add(st);

new Thread(st).start();

for(int i=0;i < threads.size();i++){

ServerThread temp = (ServerThread)threads.elementAt(i);

}

System.out.println ("Listen again...");

}

}catch(Exception ex){

System.out.println ("server is down");

}

}

}

class ServerThread implements Runnable{

private Vector threads;

private Socket socket = null;

private DataInputStream in = null;

private DataOutputStream out = null;

private int nid;

public ServerThread(Socket socket,Vector threads){

this.socket = socket;

this.threads = threads;

try {

in = new DataInputStream(socket.getInputStream());

out = new DataOutputStream(socket.getOutputStream());

}

catch (Exception ex) {

}

}

public void run(){

System.out.println ("Thread is running");

try{

while(true){

String receive = in.readUTF();

if(receive == null)

return;

if(receive.contains("黯然下线了")){

for(int i=0;i < threads.size();i++){

ServerThread st = (ServerThread)threads.elementAt(i);

st.write("***"+receive+"***");

}

}

else if(receive.contains("上线了")){

for(int i=0;i < threads.size();i++){

ServerThread st = (ServerThread)threads.elementAt(i);

st.write("<"+getID()+">: "+receive);

}

}

else if(receive.contains("监听中")){

for(int i=0;i < threads.size();i++){

ServerThread st = (ServerThread)threads.elementAt(i);

st.write("***"+receive+"*** ");

}

}

else if(receive.contains("说")){

if(receive.contains("大家")){

for(int i=0;i < threads.size();i++){

ServerThread st = (ServerThread)threads.elementAt(i);

st.write("<"+getID()+">: "+receive);

}

}

else{

int temp=receive.indexOf("<");

int temp1=receive.indexOf(">");

String tempS=receive.substring(temp+1,temp1);

int i=Integer.parseInt(tempS);

ServerThread st = (ServerThread)threads.elementAt(i);

st.write("<"+getID()+">: "+receive);

st = (ServerThread)threads.elementAt(getID());

st.write("<"+getID()+">: "+receive);

}

}

else{

ServerThread st = (ServerThread)threads.elementAt(getID());

st.write("***"+receive+"***");

}

}

}catch(Exception ex){

threads.removeElement(this);

ex.printStackTrace();

}

try{

socket.close();

}catch(Exception ex){

ex.printStackTrace();

}

}

public void write(String msg){

synchronized(out){

try{

out.writeUTF(msg);

}catch(Exception ex){

}

}

}

public int getID(){

return this.nid;

}

public void setID(int nid){

this.nid = nid;

}

}

(4)fliesendClient.java

package chat;

import java.io.BufferedReader;

import java.io.File;

import java.io.FileInputStream;

import java.io.InputStreamReader;

import java.io.OutputStream;

import java.io.PrintStream;

import java.net.Socket;

import javax.swing.JOptionPane;

public class filesendClient {

public void filesend() throws Exception{

String sendtoIP=JOptionPane.showInputDialog("请输入对方IP:");

Socket socket = new Socket(sendtoIP, 1234);

BufferedReader br = new BufferedReader(

new InputStreamReader(socket.getInputStream()));

PrintStream ps = new PrintStream(socket.getOutputStream());

File file = getFile();

ps.println(file.getName());

ps.println(file.length());

String msg = br.readLine();

if("已存在".equals(msg)){

JOptionPane.showMessageDialog(null,"文件已存在,请不要重复上传!");

return;

}

long finishLen = Long.parseLong(msg);

FileInputStream fis = new FileInputStream(file);

OutputStream out = socket.getOutputStream();

byte[] buffer = new byte[1024];

int len;

fis.skip(finishLen);

while((len = fis.read(buffer)) != -1)

out.write(buffer, 0, len);

fis.close();

socket.close();

}

public File getFile() throws Exception{

File file=null;

boolean flag=false;

while(flag==false){

String filepath=JOptionPane.showInputDialog("请输入要上传的路径:");

file = new File(filepath);

if(!file.exists()){

JOptionPane.showMessageDialog(null,"您输入的路径不存在,请重新输入!");

flag=false;

}

else if(file.isDirectory()){

JOptionPane.showMessageDialog(null,"占不支持文件夹上传!请输入一个 文件路径!");

flag=false;

}

else flag=true;

}

return file;

}

}

(5)filesendServer.java

package chat;

import java.io.BufferedReader;

import java.io.File;

import java.io.FileOutputStream;

import java.io.IOException;

import java.io.InputStream;

import java.io.InputStreamReader;

import java.io.PrintStream;

import java.net.ServerSocket;

import java.net.Socket;

import java.text.SimpleDateFormat;

import java.util.Date;

import javax.swing.JOptionPane;

public class filesendServer{

public void filereceive() throws Exception{

ServerSocket serverSocket = new ServerSocket(1234);

JOptionPane.showMessageDialog(null,"服务已启动,绑定1234端口!");

while(true){

Socket socket = serverSocket.accept();

new fileServerThread(socket).start();

}

}

}

class fileServerThread extends Thread{

Socket socket;

public fileServerThread(Socket socket) {

this.socket = socket;

}

public void run() {

FileOutputStream fos = null;

try {

BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));

PrintStream ps = new PrintStream(socket.getOutputStream());

String fileName = br.readLine();

long fileLen = Long.parseLong(br.readLine());

File dir = new File("upload");

dir.mkdir();

File file = new File(dir,fileName);

if(file.exists() && file.length() == fileLen){

ps.println("已存在");

return;

}

else{

ps.println(file.length());

}

String time = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());

System.out.println(time + " "+ (file.exists() ? " 开始断点续传: " : " 开始上传文件: ") + file.getName());

long start = System.currentTimeMillis();

InputStream in = socket.getInputStream();

fos = new FileOutputStream(file, true);

byte[] buffer = new byte[1024];

int len;

while((len = in.read(buffer)) != -1){

fos.write(buffer, 0, len);

if(file.length() == fileLen)

break;

}

fos.close();

long end = System.currentTimeMillis();

time = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());

System.out.println(time + " " + " 上传文件结束: " + file.getName() + ", 耗时: " +  (end - start) + "毫秒");

ps.println("上传成功");

socket.close();

} catch (IOException e) {

if(fos != null)

try {

fos.close();

} catch (IOException e1) {

e1.printStackTrace();

}

}

}

}

时间: 2024-08-15 07:48:44

团队项目第四周的相关文章

10.2: 现代软件工程这门课已经上了好几年了,以前有很多学生做过团队项目(说不定包括本校的学生),请你们找一个以前的团队采访一下-------------答题者:徐潇瑞

10.2: 现代软件工程这门课已经上了好几年了,以前有很多学生做过团队项目(说不定包括本校的学生),请你们找一个以前的团队采访一下 - 当时的项目有多少用户,给用户多少价值? 现在还有人用吗? - 这个项目能否给我们团队继续开发,源代码/文档还有么? - 项目开发有什么经验和教训 - 对学好软件工程有什么建议 写成一个博客   #团队博客作业2 根据老师的作业要求,我们采访了以前本科认识的一个同学,他在读本科的时候出去实习,参与了一些项目.他参与了手机外卖app的开发,根据他的回答,当时用户有1

团队项目利用Msbuild自定义Task实现增量发布

最近一直在做自动部署工具,主要利用到了Msbuild的自定义Task,通过Task我们可以自定义编译.部署过程减少人工直接干预.Msbuild的详细用法,可以去园子里搜一下,有很多的基础教程,这里就不赘述了,还是集中说一下增量发布的问题. 增量主要涉及到三部分内容,程序.配置和静态文件(例如CSS.JS等),程序的增量比较简单,通过版本对比或者TFS的修改记录便可以查询出被修改过的程序集.配置文件增量大致有两种,全增量和部分增量.全增量也很简单,直接把修改过的配置文件复制到发布包就OK了:部分增

团队项目开发特点以及NABCD分析总结

团队项目的特点:开发的这款软件是从我们的日常生活中得到的启发,现在正是大学阶段,刚刚开始管理自己每个月的生活费,并且在大学中每个月的生活费会有很多去处,然而记录在本子上又容易丢,而且不好分类,所以我们想开发这个软件,实现学生的网上记录,并且可以根据输入将这些分类,进行每月的总结. N:解决了大学生生活费管理不够清楚,分类不够细化的问题.生活费不知去向的问题 A:有一定的编程基础,并且可以通过查询资料将代码用安卓开发工具包装成一个安卓版的手机APP B:可以将用户记账难的问题解决,使记账变得不再复

团队项目(一)

团队项目我们组是要做一款局域网聊天工具,是可以允许用户在局域网中创建聊天室并聊天.对于在同一局域网中有聊天.群聊需求的用户十分有帮助,面向高校.企业用户.无需连接因特网,在局域网便可以开启群聊. 具体需求分析如下: 以下数字代表功能需求优先级,最大为10. 业务需求: 私人即时文字交流(10): 一对一的文字交流,一个客户端发送方与一个接收方,发出字符串后接收. 多人即时文字交流(9): 一个客户端发送方与多个接收方,发出字符串(长度<50)后接收. 图形用户界面(10): 提供简洁易懂的图形用

团队项目个人总结

团队项目个人总结 基本内容 工大助手(桌面版) 实现登陆.查成绩.计算加权平均分等功能 团队人员 13070002 张雨帆 13070003 张帆 13070004 崔巍 13070006 王奈 13070045 汪天米 13070046 孙宇辰 总结 经过此次的软件工程团队项目,我对团队软件开发有了更深入的认识.一个团队,想要高效的运转需要组长良好的组织和组内每个人的通力合作,统筹规划十分重要.我们组一开始就遇到了这样的问题.没有良好的组织,大家不知道自己应该做哪些方面的内容,也不知道其他成员

团队项目失败总结

很遗憾 ,这次团队项目失败了.预定的是做一个简易四则运算器,以计算为辅,出题为主.出题包含两部分,小学部分和初中部分.现在只完成了小学部分,计算器部分也完成了.我们团队的基本配置是:一位主编(我).两位副编,一位负责计算器模块另一位负责UI.一人专司文档.一人做需求分析.一人做系统测试.分析此次项目失败,原因很多,主要有二:(1)所选编程语言不熟——Java,此前从未接触过Java,因为做项目的时候要考虑UI,用C语言就不合适了,C++用的也不熟,就选了Java.只能一边学一边用.我选的参考书是

团队项目冲刺第九天

团队项目冲刺第九天个人工作总结如下: 1.昨天干了什么? 昨天将部分整合的界面进行了修改完善,并且连接数据库测试了登录注册的功能. 2.今天准备干什么? 今天准备将后续完成的界面和功能继续从整体的软件中进行添加完善,如各个模块中的功能界面. 3.遇到什么困难? 一些界面的跳转遇到问题,前一时间段的界面整合中,界面的跳转都是用intent对象连接两个有逻辑跳转的界面,但是后续完成的界面用了fragment,activity里面可以包括多个fragment,使用intent对象实现跳转所要求的形参必

团队项目冲刺第七天

团队项目冲刺第七天个人工作总结如下: 1.昨天干了什么? 昨天对团队成员做完的部分界面进行了整合,同时对一些界面进行了优化. 2.今天准备干什么? 今天继续整合界面,将各个界面的主题或者布局进行统一,另外,今天准备做一个欢迎的界面,即一打开app有一个标志性的界面. 3.遇到什么困难? 不知道如何设置全屏界面,改变了theme,课时仍然得不到想要的界面效果,目前还没有解决:另外,对于安卓的MVC模式有点模糊,对于活动的使用不熟悉,浪费了很多的时间.

[团队项目]----Math Calculator

团队项目 ----Math Calculator 任务: 1.每个团队从Github上fork这个项目的源代码 https://github.com/RABITBABY/We-have-bing 2.了解.部署.运行这个项目,理解其功能及实现: 3.进行必要的测试,发现软件的bug并记录,并进行bug的排除: 发布博客内容: 简要说明如何下载部署运行这个项目: 补充这个软件的单元测试并提交到Github上: 解释说明找出的bug及修复情况: 列出每个团队成员的个人贡献分. -----------