java socket import java.awt.*; import java.awt.event.*;

mammetlizardlickΛογισμικό & κατασκευή λογ/κού

3 Νοε 2013 (πριν από 3 χρόνια και 8 μήνες)

78 εμφανίσεις


java
语言编一个聊天小程序

要求:

使用图形用户界面。

能实现一个聊天室中多人聊天。

可以两人私聊。

提示:使用
socket
通信

import java.awt.*;

import java.awt.event.*;

import javax.swing.*;

import java.net.*;

import java.io.*;


public class test

{


public static void main(String[] args)


{


EventQueue.invokeLat
er(new Runnable()


{


public void run()


{


DrawFrame frame = new DrawFrame();


frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);


frame.setVisible(true);


}


});


}


}

class DrawFrame extends JFrame

{


public DrawFrame()


{



setLoca
tion(100,100);


setTitle("
我的
QQ");


setSize(DEFAULT_WIDTH,DEFAULT_HEIGHT);

//
添加菜单项
……


JMenuBar menuBar = new JMenuBar();


setJMenuBar(menuBar);


JMenu edit = new JMenu("
菜单
");


menuBar.add(edit);


JMenuItem sset = new JMenuItem("
设置
");


JMenuItem eexit = new JMenuItem("
退出
");


edit.add(sset);


edit.addSeparator();


edit.add(eexit);


final DrawPanel pan = new DrawPanel();


//
添加设置对话框


sset.addActionListener(new ActionListener(){


public void actionPerformed(ActionEvent event)


{


final JFrame jf = new JFrame("
设置
");



jf.setSize(300,150);


jf.setLocation(200,200);


jf.setResizable(false);


jf.setVisible(true);


JPanel jp = new JPanel();


final JTextField jt1 = new JTextField(20);


final JTextField jt2 = new JTextField(20);


final JTextField jt3
= new JTextField(20);


jp.add(new JLabel("
聊天端口
:"));


jf.add(jp);


jp.add(jt1);


jp.add(new JLabel("
目标地址
:"));


jp.add(jt2);


jp.add(new JLabel("
文件端口
:"));


jp.add(jt3);


JButton jb1 = new JButton("
确定
");


JButton jb2 = new JButton("
取消
");


jp.add(jb1);


jp.add(jb2);


/
/
设置

设置

按钮


jb1.addActionListener(new ActionListener(){


public void actionPerformed(ActionEvent event){


try{


int cat1 = Integer.parseInt(jt1.getText());


pan.setCat1(cat1);//
设置对话端口号


int cat2 = Integer.parseInt(jt3.getText()
);


pan.setCat2(cat2);//
设置文件传输端口号


String s = jt2.getText();


pan.setIP(s);//
设置
IP
地址


pan.ls();


}


catch(Exception e)


{


e.printStackTrace();


}


jf.dispose();//
关闭对话框


}


});


jb2.addActionL
istener(new ActionListener(){


public void actionPerformed(ActionEvent event){


jf.dispose();


}


});


}


});


eexit.addActionListener(new ActionListener(){


public void actionPerformed(ActionEvent event){


System.exit(0);


}


}
);




add(pan);


pack();


}


public static final int DEFAULT_WIDTH = 400;


public static final int DEFAULT_HEIGHT = 400;

}

class DrawPanel extends JPanel

{


DatagramSocket ds;


DatagramPacket dp;


DatagramSocket ds1;


DatagramPacket dp1;


Thread thread;


Thread thread1;


TextArea textArea1 = new TextArea(10,50);


TextArea textArea2 = new TextArea(10,50);


JTextField textField = new JTextField(50);


static int cat1,cat2;


static String IP;


public void setCat1(int cat)


{


cat1 = cat;


}


public void se
tCat2(int cat)


{


cat2 = cat;


}


public void setIP(String ip)


{


IP=ip;


}


//
重置端口号


public void ls()


{


try


{


ds = new DatagramSocket(cat1);


ds1 = new DatagramSocket(cat2);


}


catch(Exception e)


{


e.printStackTrace();


}


thread = new Thread(new Runnable()


{


public void run()


{


byte buf[] = new byte[
1024];//
聊天每次发送文字不能超过
1024b


DatagramPacket dp = new DatagramPacket(buf,buf.length);



while(true)


{


try


{


ds.receive(dp);


textArea1.setText(textArea1.getText()+ new String(buf,0,dp.getLength())
+ "
\
r
\
n");


}


catch(Ex
ception e)


{


e.printStackTrace();


}


}


}


});


thread.start();


}


public DrawPanel()


{





setLayout(new BorderLayout());


JTabbedPane card = new JTabbedPane();




textArea1.setEditable(false);


card.add("
聊天
",textArea1);


add(card,BorderLayout.NORTH);



JPanel center = new JPanel();


center.setLayout(new FlowLayout());


center.add(new JLabel("
昵称:
"));



center.add(textField);


add(center,BorderLayout.CENTER);



JPanel south = new JPanel();


south.setLayout(new Borde
rLayout());




south.add(textArea2,BorderLayout.NORTH);



JPanel south2 = new JPanel();


south2.setLayout(new FlowLayout());


JButton sent = new JButton("
传送文件
");


JButton receive = new JButton("
接收文件
");


//receive.setEnabled(false);


JButton sentMe
ssage = new JButton("
发送
");


south2.add(sent);


south2.add(receive);



south2.add(sentMessage);


add(south,BorderLayout.SOUTH);


south.add(south2,BorderLayout.SOUTH);


//
发送信息的按钮的监听器
:


sentMessage.addActionListener(new ActionListener()


{


public v
oid actionPerformed(ActionEvent event)


{


textArea1.append(textField.getText()+":"+textArea2.getText()+"
\
n");


String s;


try


{


s = textField.getText() + ":" + textArea2.getText();


byte[] buf = s.getBytes();


dp = new
Datagram
Packet(buf,buf.length,InetAddress.getByName(IP),cat1);


ds.send(dp);


textArea2.setText("");


}


catch (Exception ex)


{


ex.printStackTrace();


}


}


});


//
发送文件的按钮的监听器


sent.addActionListener(new ActionListener()


{


publi
c void actionPerformed(ActionEvent event)


{


JFrame f = new JFrame("
打开
");


f.setSize(400,300);


JFileChooser chooser = new JFileChooser();


f.add(chooser);


int returnVal = chooser.showOpenDialog(f);


if(returnVal == JFileChooser.APPRO
VE_OPTION)


{


textArea1.append("
正在传送文件
:"+chooser.getCurrentDirectory()+"
\
\
"


+chooser.getSelectedFile().getName()+"
\
n");


try


{


byte[] b = new byte[10248];


FileInputStream fis = new FileInputStream(chooser.getSelectedFile(
));


DataInputStream dos =new DataInputStream(fis);


dos.read(b);


dp1 = new
DatagramPacket(b,b.length,InetAddress.getByName(IP),cat2);


ds1.send(dp1);


}


catch (Exception e)


{


e.printStackTrace();


}


}



}


});


//
接收文件的按钮的监听器
:


receive.addActionListener(new ActionListener()


{


public void actionPerformed(ActionEvent event)


{


JFrame f1 = new JFrame("
保存
");


f1.setSize(400,300);


byte buf[] = new byte[10248];


DatagramPacket dp1 = new
DatagramPacket(buf,buf.length);


JFileChooser ch = new JFileChooser();


f1.add(ch);


int a = ch.showSaveDialog(f1);


if(a ==JFileChooser.APPROVE_OPTION)


{


String fileName = ch.getSelectedFile().getPath();


try


{


ds1.rece
ive(dp1);


FileOutputStream fos = new FileOutputStream(fileName);


fos.write(buf);


}


catch(Exception e)


{


e.printStackTrace();


}


}


}


});


}

}