摘要:聊天室掌握使用語(yǔ)言進(jìn)行面向?qū)ο笤O(shè)計(jì)的基本方法,提高運(yùn)用分析問(wèn)題,解決問(wèn)題的能力。使用技術(shù)完成聊天室系統(tǒng),深入學(xué)習(xí)使用語(yǔ)言。
C/S聊天室
1.掌握使用JAVA語(yǔ)言進(jìn)行面向?qū)ο笤O(shè)計(jì)的基本方法,提高運(yùn)用分析問(wèn)題,解決問(wèn)題的能力。
2.使用Java技術(shù)完成聊天室系統(tǒng),深入學(xué)習(xí)使用Java語(yǔ)言。
3.使用Java 的多線程機(jī)制,深入理解Java多線程技術(shù)的應(yīng)用。
4.使用AWT和Swing事件,對(duì)Java的深入學(xué)習(xí)。
5.使用網(wǎng)絡(luò)編程,掌握基于TCP協(xié)議的Socket編程,了解Socket編程的協(xié)議約定,掌握簡(jiǎn)單應(yīng)用協(xié)議的開發(fā)。
6.使用C/S架構(gòu),對(duì)網(wǎng)絡(luò)編程有一定的了解
7.熟悉事件監(jiān)聽的應(yīng)用和方法的編寫
代碼如下:
**
①:Client客戶端
</>復(fù)制代碼
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.net.*;
import javax.swing.*;
import org.omg.CORBA_2_3.portable.OutputStream;
public class Demo1 extends JFrame implements ActionListener, MouseListener{
JTextArea area;
JComboBox box;
JTextField field1,field2,field3;
JLabel label,label1;
JButton button1,button2;
JPanel panel1,panel2;
JPopupMenu pop;
JMenuItem popm1,popm2,popm3;
Socket soc;
InputStream in;
public Demo1(){
super("聊天室");
this.setBounds(100, 100, 500, 400);
area=new JTextArea(8,8);
area.addMouseListener(this);
area.setLineWrap(true);//自動(dòng)換行
area.setEditable(false);//設(shè)置文本區(qū)域不可編輯
JScrollPane js=new JScrollPane(area);//添加滾動(dòng)條
js.setBounds(0,0,480,250);
js.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);//設(shè)置總是出現(xiàn)滾動(dòng)條
panel1=new JPanel();
panel2=new JPanel();
String str[]={"所有人","0","1","2"};
box=new JComboBox(str);
field1=new JTextField(20);
field1.setEditable(false);
field1.addActionListener(this);
button1=new JButton("發(fā)送");
button1.setEnabled(false);
button1.addActionListener(this);
label1=new JLabel("用戶名:");
field3=new JTextField(9);
label=new JLabel("服務(wù)器名");
field2=new JTextField(8);
field2.setText("localhost");
field2.addActionListener(this);
button2=new JButton("連接");
button2.addActionListener(this);
panel1.add(box);
panel1.add(field1);
panel1.add(button1);
panel1.setBounds(50,260,400,50);
panel2.add(label1);
panel2.add(field3);
panel2.add(label);
panel2.add(field2);
panel2.add(button2);
panel2.setBounds(50,310,400,50);
pop=new JPopupMenu();
popm1=new JMenuItem("復(fù)制");
popm1.addActionListener(this);
popm2=new JMenuItem("剪切");
popm2.addActionListener(this);
popm3=new JMenuItem("粘貼");
popm3.addActionListener(this);
pop.add(popm1);
pop.add(popm2);
pop.add(popm3);
area.add(pop);
area.addMouseListener(this);
field1.add(pop);
field1.addMouseListener(this);
setLayout(null);
add(js);
add(panel1);
add(panel2);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
}
public static void main(String[] args) {
// TODO Auto-generated method stub
new Demo1();
}
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
if(e.getActionCommand().equals("復(fù)制")){
area.copy();
}
if(e.getActionCommand().equals("剪切")){
field1.cut();
}
if(e.getActionCommand().equals("粘貼")){
field1.paste();
}
if(e.getSource()==button1||e.getSource()==field1){
area.append(field3.getText()+"對(duì)"+box.getSelectedItem()+"說(shuō): "+field1.getText()+"
");
//area.append(field1.getText()+"
");
try {
java.io.OutputStream out = soc.getOutputStream();
BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(out));
//bw.write("對(duì)"+this.getTitle()+"說(shuō):"+field1.getText());
bw.write(field3.getText()+"-"+box.getSelectedItem()+"-"+field1.getText());
bw.newLine();//換行
bw.flush();//刷新
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
field1.setText("");
}else{
if(e.getActionCommand().equals("連接")&&field2.getText().equals("")){
JOptionPane.showMessageDialog(null,"請(qǐng)輸入正確的服務(wù)器名","信息",JOptionPane.INFORMATION_MESSAGE);
}else if(e.getSource()==field2||e.getActionCommand().equals("連接")){
String fuwuqi=field2.getText();
if(!fuwuqi.equals("")){
System.out.println("服務(wù)器地址:"+fuwuqi);
try {
soc=new Socket(fuwuqi,7890);
new ClientThread(soc.getInputStream(),area,field3.getText()).start();//當(dāng)連接成功時(shí),則啟動(dòng)線程
field2.setEditable(false);//當(dāng)連接成功時(shí),便不可再連接
button2.setEnabled(false);//設(shè)定連接按鈕不可連接
field1.setEditable(true);//設(shè)定field1文本框可用
button1.setEnabled(true);//連接成功,則設(shè)發(fā)送按鈕可用
String name=field3.getText();//獲取用戶名文本框中的值
this.setTitle(name+"聊天室");//設(shè)置標(biāo)題
area.append(name+"登錄成功!"+"
");
java.io.OutputStream out = soc.getOutputStream();
PrintWriter pw=new PrintWriter(out,true);
pw.println("login"+"-"+field3.getText()+"-"+"上線啦!");
field3.setEditable(false);//輸入用戶名文本框設(shè)為不可用
//field3.setText("");//將用戶名文本框的內(nèi)容置為空
} catch (UnknownHostException e1) {
// TODO Auto-generated catch block
//e1.printStackTrace();
System.out.println("請(qǐng)輸入正確的服務(wù)器名!");
} catch (IOException e1) {
// TODO Auto-generated catch block
//e1.printStackTrace();
System.out.println("服務(wù)器連接異常!");
}
}
field2.setText("");
}
}
}
@Override
public void mouseClicked(MouseEvent e){
if(e.getButton()==3){
if(e.getSource()==area){
pop.show(area,e.getX(),e.getY());
}else if(e.getSource()==field1){
pop.show(field1,e.getX(),e.getY());
}
}
}
@Override
public void mouseEntered(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseExited(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mousePressed(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseReleased(MouseEvent e) {
// TODO Auto-generated method stub }
}//該線程用來(lái)接收服務(wù)器發(fā)來(lái)的消息
class ClientThread extends Thread{
private InputStream in;
JTextArea area;
String user;
public ClientThread(InputStream in,JTextArea area,String user){
this.in=in;
this.area=area;
this.user=user;
}
public void run(){
try {
BufferedReader br=new BufferedReader(new InputStreamReader(in));
String line=null;
while((line=br.readLine())!=null){
System.out.println("服務(wù)器發(fā)來(lái)的消息:"+line);
String temp[]=line.split("-");
if(temp[0].equals("login")){
if(!(temp[1].equals(user))){
area.append(temp[1]+"上線啦!
");
}
}else if(temp[1].equals("所有人")){
if(!(temp[0].equals(user))){
area.append(temp[0]+"對(duì)所有人說(shuō):"+temp[2]+"
");
}
}else if(temp[1].equals(user)){//接受者剛好是本身
area.append(temp[0]+"對(duì)你說(shuō):"+temp[2]+"
");
}
}
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace(); }
}
}
②:代碼:Server服務(wù)器
</>復(fù)制代碼
import java.util.*;
import java.io.*;
import java.net.*;
public class Server {
static ServerSocket ser;
InputStream in;
OutputStream out;
static Socket soc;
public static void main(String[] args) {
// TODO Auto-generated method stub
int count=0;//統(tǒng)計(jì)連接客戶端的個(gè)數(shù)
ArrayList all=new ArrayList();//創(chuàng)建一個(gè)容器,用來(lái)保存socket對(duì)象
try {
ser=new ServerSocket(7890);
while(true){
soc=ser.accept();
count++;
//創(chuàng)建線程對(duì)象并開啟
all.add(soc);
System.out.println(count+"個(gè)連接成功");
new ServerThread(soc.getInputStream(),soc.getOutputStream(),all).start();
/*Thread t=new ServerThread(soc.getOutputStream());
t.start();*/
}
} catch (IOException e) {
// TODO Auto-generated catch block
//e.printStackTrace();}
}
}
class ServerThread extends Thread{
//定義一個(gè)線程類,用來(lái)循環(huán)讀取客戶端發(fā)送過(guò)來(lái)的消息
private InputStream in;
private OutputStream out;
ArrayList all;
public ServerThread(InputStream in,OutputStream out,ArrayList all){
this.in=in;
this.out=out;
this.all=all;
}
public void run(){
BufferedReader br=new BufferedReader(new InputStreamReader(in));
//BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(out));
String line=null;
try {
while(true){
line=br.readLine();
// bw.write(line);//將客戶端發(fā)來(lái)的消息再發(fā)回
// bw.newLine();
// bw.flush();
System.out.println("客戶端:"+line);
for(int i=0;i
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/70999.html
摘要:年開發(fā)者不得不知的技術(shù)趨勢(shì)作為一個(gè)開發(fā)者,無(wú)論是做前端還是后端,都應(yīng)該時(shí)刻保持著對(duì)技術(shù)的敏感性。這是一個(gè)預(yù)報(bào)天氣的聊天機(jī)器人。微信小程序年月微信小程序正式上線。年剛剛開始,作為一個(gè)開發(fā)者,保持對(duì)前沿技術(shù)的敏感性,提升格局,放眼遠(yuǎn)方。 showImg(https://segmentfault.com/img/bV1mBS?w=700&h=350); 2018年『web』開發(fā)者不得不知的技...
摘要:練習(xí)項(xiàng)目備選清單文件下載器功能概要設(shè)計(jì)實(shí)現(xiàn)新建下載功能以為基礎(chǔ)給出下載鏈接可以啟動(dòng)下載任務(wù)實(shí)現(xiàn)局域網(wǎng)內(nèi)下載傳輸文件以單線程下載方式實(shí)現(xiàn)附加功能支持?jǐn)帱c(diǎn)續(xù)傳實(shí)現(xiàn)多線程下載實(shí)現(xiàn)下載參考技術(shù)套接字編程多線程編程音視頻播放器功能概要設(shè)計(jì)實(shí)現(xiàn)播放常見 練習(xí)項(xiàng)目備選清單 Utilities 1. 文件下載器 功能概要設(shè)計(jì): 實(shí)現(xiàn)新建下載功能(以ftp為基礎(chǔ)) 給出下載鏈接可以啟動(dòng)下載任務(wù) 實(shí)現(xiàn)局...
摘要:練習(xí)項(xiàng)目備選清單文件下載器功能概要設(shè)計(jì)實(shí)現(xiàn)新建下載功能以為基礎(chǔ)給出下載鏈接可以啟動(dòng)下載任務(wù)實(shí)現(xiàn)局域網(wǎng)內(nèi)下載傳輸文件以單線程下載方式實(shí)現(xiàn)附加功能支持?jǐn)帱c(diǎn)續(xù)傳實(shí)現(xiàn)多線程下載實(shí)現(xiàn)下載參考技術(shù)套接字編程多線程編程音視頻播放器功能概要設(shè)計(jì)實(shí)現(xiàn)播放常見 練習(xí)項(xiàng)目備選清單 Utilities 1. 文件下載器 功能概要設(shè)計(jì): 實(shí)現(xiàn)新建下載功能(以ftp為基礎(chǔ)) 給出下載鏈接可以啟動(dòng)下載任務(wù) 實(shí)現(xiàn)局...
閱讀 1010·2023-04-25 15:42
閱讀 3604·2021-11-02 14:38
閱讀 2897·2021-09-30 09:48
閱讀 1439·2021-09-23 11:22
閱讀 3399·2021-09-06 15:02
閱讀 3196·2021-09-04 16:41
閱讀 614·2021-09-02 15:41
閱讀 2025·2021-08-26 14:13