class ChatRoomClient import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.net.*;
public class ChatRoomClient extends Frame implements Runnable{
Panel panel1,panel2,panel3;
Button button1,button2;
TextField textField1,textField2,textField3;
Label label1,label2,label3;
TextArea textArea;
ScrollPane sPanel;
//net
PrintWriter out;
BufferedReader in=null;
Socket sock;
public final static int DEFAULT_PORT=8080;
//create Thread to Read information from Server
Thread readThread;
boolean isTrue=true;//thread can go on runing ??
public ChatRoomClient(){
try{
jbInit();
}catch(Exception e){
e.printStackTrace();
}
}
public static void main(String[] args){//main method
ChatRoomClient c=new ChatRoomClient();
c.show();
}
private void jbInit(){//should set size,position and Font of every component
button1=new Button("连接");// set Font
button2=new Button("发送");
textField1=new TextField("input Server address here!");
textField2=new TextField("input Message here and send to server");
label1=new Label("消息:");
label2=new Label("在线好友");
label3=new Label("在线人数:()");
panel1=new Panel();
panel2=new Panel();
panel3=new Panel();
sPanel=new ScrollPane();
textArea=new TextArea();
//panel1
//press button1: 连接 to connect the client to server
button1.addActionListener(new java.awt.event.ActionListener(){
public void actionPerformed(ActionEvent e){
button1_actionPerformed(e);
}
});
//textField1:for input the address of server;be registered to KeyListener.
//press key:Enter to connect the client to server
textField1.addKeyListener(new textField1_KeyAdapter(this));//java.awt.event.KeyAdapter()
panel1.add(button1);
panel1.add(textField1);
//sPanel ScrollPane
sPanel.add(textArea);
//panel2
//press button2: 发送 to send message
button2.addActionListener(new java.awt.event.ActionListener(){
public void actionPerformed(ActionEvent e){
button2_actionPerformed(e);
}
});
//textField2:for input message;be registered to KeyListener.
//press key:Enter to send message
textField2.addKeyListener(new textField2_KeyAdapter(this));
panel2.add(label1);
panel2.add(textField2);
panel2.add(button2);
panel3.add(label3);
panel3.add(label2);
//frame
this.addWindowListener(new ChatFrame_WindowAdapter(this));//frame is registered to WindowListener
this.setLayout(new BorderLayout());
this.setBackground(Color.GREEN);
this.setSize(500,400);
this.add(panel1,BorderLayout.NORTH);
this.add(sPanel,BorderLayout.CENTER);
this.add(panel2,BorderLayout.SOUTH);
this.add(panel3,BorderLayout.EAST);
//this.show()
}
public void startConnect(){//开始连接
try{
sock=new Socket(textField1.getText(),8080);
if(sock!=null){//connection successed
processMsg("Connect successfully!");
}
in=new BufferedReader(new InputStreamReader(sock.getInputStream()));
out=new PrintWriter(sock.getOutputStream());
}catch(IOException ex){
processMsg(ex.toString());
processMsg("Connect failed!");
}
readThread=new Thread(this);
readThread.start();
}
//public void endConnect(){//close IOstream
public void sendInformation(){
out.println(textField2.getText());
out.flush();
}
private void button1_actionPerformed(ActionEvent e){//连接按钮
startConnect();
}
private void button2_actionPerformed(ActionEvent e){//发送按钮
sendInformation();
}
public void stopRun(){//to stop the running thread
isTrue=false;
}
public void processMsg(String msg){//客户端处理消息
textArea.append(msg);
textArea.append("\n");
}
public void run(){
String msg;
isTrue=true;
while(isTrue){
try{
msg=in.readLine();
if(msg.equals("Server exit!")){//server exit
processMsg(msg);
stopRun();//终止线程
}else if(msg!=null){
processMsg(msg);
}
Thread.sleep(1000);
}catch(IOException e){
processMsg(e.toString());
}catch(InterruptedException ei){
processMsg(ei.toString());
}
}
//endConnect();
try{//服务器退出关闭连接和相关的"流"
sock.close();
in.close();
out.close();
}catch(IOException ioe){}
}
public void exit(){//窗口关闭;如果有连接则关闭连接和相关的"流"
try{//send "Client exit!" to Server!
out.println("Client exit!");
out.flush();
}catch(Exception exc){}
//endConnect();
try{//close IOstream
sock.close();
in.close();
out.close();
}catch(IOException ioe){}
finally{
System.exit(0);
}
}
}
//文本筐textField1的键击事件适配器
class textField1_KeyAdapter extends java.awt.event.KeyAdapter{
ChatRoomClient chatFrame;
public textField1_KeyAdapter(ChatRoomClient chatFrame){
this.chatFrame=chatFrame;
}
public void keyPressed(KeyEvent e){//输入的是enter,开始连接!
int j=e.getKeyCode();
if(j==e.VK_ENTER){
chatFrame.startConnect();
}
}
}
//文本筐textField2的键击事件适配器
class textField2_KeyAdapter extends java.awt.event.KeyAdapter{
ChatRoomClient chatFrame;
public textField2_KeyAdapter(ChatRoomClient chatFrame){
this.chatFrame=chatFrame;
}
public void keyPressed(KeyEvent e){//键击Enter键,发送信息!
int j=e.getKeyCode();
if(j==e.VK_ENTER){
chatFrame.sendInformation();
}
}
}
//窗口关闭事件适配器
class ChatFrame_WindowAdapter extends java.awt.event.WindowAdapter{
ChatRoomClient chatFrame;
public ChatFrame_WindowAdapter(ChatRoomClient chatFrame){
this.chatFrame=chatFrame;
}
public void windowClosing(WindowEvent e){//exit program
chatFrame.exit();//reference to the method exit() in ChatRoomClient.
}
}
解决方案 »
- [求助]Junit测试时遇到一个奇怪的问题:FileNotFoundException
- 初学JAVA,想用java写一个收发邮件的程序,那要学哪些东西啊
- 帮忙看看,怎么会出错呢?
- 关于Linux下的换行符
- 求哪里可以注册免费的imap协议的邮箱?
- 方法不能写在public static main()里了吗?
- 中文截取的问题
- hashMap可不可以方便得得到第i个值呀?
- 不好意思!又问问题了,我是个JAVA新手,刚学2个月,现在忙于赶项目,问题很多,但都不是很难!我觉得还没有完全理解Java的事件处理机制
- 有知道理想信息(深圳分公司)的么,顺便散纷
- 在线等(急问) : 如何在我的程序中实现 服务器端向客户端返回 数据
- 关于用JDBC连接SQL Server 2000,急,在线等待!
public class Server {//主服务器类
public static void main(String args[]) throws IOException {
ServerSocket s = new ServerSocket(8080);//在8080端口创建套接口
System.out.println("Server start.." + s);
try {
while (true) {
Socket socket = s.accept();//无限监听客户的请求
System.out.println("Connectino accept:" + socket);
try {
new ServerThread(socket);//创建新线程
} catch (IOException e) {
socket.close();
}
}
} finally {
s.close();
}
}
}
客户端连接服务器发出请求
Socket socket = new Socket(InetAddress.getByName(server), serverport);//连务器
out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true);
out.println("request");
服务器端接受请求,发出回映
public ServerThread(Socket s) throws IOException {//线程构造函数
socket = s;//取得传递参数
in = new BufferedReader(new InputStreamReader(socket.getInputStream()));//创建输入流
out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true);//创建输出流
start();//启动线程
}public void run(){
while(true){
String str = in.readLine();//取得输入字符串
if ("request".equals(str)){
out.println("response");
}
}
}
以上是用数据流实现服务器与客户进行通信。也可以用数据报的形式进行通信,但是不太可靠。