您的位置:首页 > 编程语言 > Java开发

JAVA学习第十六天

2015-08-06 22:26 429 查看

客户端与客户端之间的通信 可显示时间 发送ip 接收ip

package com.donghe.test;

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Set;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.border.EmptyBorder;

import net.sf.json.JSONObject;

import javax.swing.DefaultListModel;
import javax.swing.JButton;
import javax.swing.JTextArea;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import javax.swing.JList;
import javax.swing.JLabel;
import java.awt.Label;

public class MyServer extends JFrame {

private DefaultListModel<String> model;
private JPanel contentPane;
// private ArrayList<Socket> sockets;// socket数组
private HashMap<String, Socket> sockets;
JTextArea textArea;
private boolean isRunning = true;

public boolean isRunning() {
return isRunning;
}

public void setRunning(boolean isRunning) {
this.isRunning = isRunning;
}

/**
* Launch the application.
*/
public static void main(String[] args) {

EventQueue.invokeLater(new Runnable() {
public void run() {
try {
MyServer frame = new MyServer();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}

/**
* Create the frame.
*/
public MyServer() {

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 450, 300);
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
setContentPane(contentPane);
contentPane.setLayout(null);

JButton button = new JButton("启动服务器");
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
isRunning = true;

Runnable run = new Runnable() {// 匿名内部类

@Override
public void run() {
// TODO Auto-generated method stub
try {
System.out.println("服务器启动");
ServerSocket server = new ServerSocket(8080);// 等待客户端连接
sockets = new HashMap<>();
while (isRunning) {// 循环
Socket socket = server.accept(); // 有客户端连接进来
System.out.println("客户端连接" + socket.getInetAddress().getHostAddress()); // 每循环一次(如果有客户端连接的话)就会产生一个新的socket
String ip = socket.getInetAddress().getHostAddress();
sockets.put(ip, socket);
MyServerReadThread msr = new MyServerReadThread(socket, MyServer.this);// 需要另起一个线程与对应的client通信
Thread t = new Thread(msr);
t.start();
}
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
};
Thread t = new Thread(run);// 括号里面填的是接口 Runnable
t.start();

// new Thread(new Runnable() {
// @Override
// public void run() {
// // TODO Auto-generated method stub
// try {
// ServerSocket server = new ServerSocket(8080);
// System.out.println("服务器启动");
// sockets = new HashMap<>();
// while (isRunning) {
// Socket socket = server.accept();// 有客户端连入
// sockets.put(socket.getInetAddress().getHostAddress(),
// socket);// 添加
// System.out.println(socket.getInetAddress().getHostAddress() +
// "客户端连入");
// Thread t = new Thread(new MyServerReadThread(MyServer.this,
// socket));
// t.start();
// }
// } catch (IOException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// }
//
// }
// }).start();

}
});

button.setBounds(312, 103, 99, 34);
contentPane.add(button);

textArea = new JTextArea();
textArea.setBounds(10, 228, 292, 24);
contentPane.add(textArea);

JButton button_1 = new JButton("发给客户端");
button_1.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {

}
});
button_1.setBounds(312, 228, 99, 24);
contentPane.add(button_1);

JList list = new JList();
list.setBounds(10, 10, 292, 212);
model = new DefaultListModel<>();
list.setModel(model);
JScrollPane scroll = new JScrollPane(list);// list为组件
// 大小超过指定的视图大小就会显示水平和垂直滚动条
scroll.setBounds(10, 10, 292, 212);// 大小一样 滚动条
contentPane.add(scroll);// 添加滚动条就行
}

public void readLine(String line) {
System.out.println("开始解析" + line);
JSONObject obj = JSONObject.fromObject(line);
String type = obj.getString("type");

model.addElement(line);
// 需要将socket中读到的信息显示在JList中 首先想到的是model.addElement(line)
// 而line在MyServerReadThread中 不能被调用因为MyServerReadThread是一个线程
// 所以实现这个目的 只能从MyServerReadThread调用 这句话 而这句话放在一个方法里面

if (type.equals("toSingle")) {
String to = obj.getString("to");
String msg = obj.getString("message");
String from = obj.getString("from");
String time = obj.getString("time");
Socket toSocket = sockets.get(to);
// if (toSocket.isConnected()) {
try {
OutputStream os = toSocket.getOutputStream();
OutputStreamWriter osw = new OutputStreamWriter(os);
BufferedWriter bw = new BufferedWriter(osw);
// bw.write(msg + "\n");
bw.write(line + "\n");
System.out.println("服务器推送出去信息");// 推送给toSocket
bw.flush();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
// }else{
// sockets.remove(toSocket);
// }
}

}
}

// public void read(Socket socket) {
// if (socket.isConnected()) {// 如果socket连接
// try {
// InputStream is = socket.getInputStream();
// BufferedReader br = new BufferedReader(new InputStreamReader(is));
// String line = br.readLine();
// model.addElement(socket.getInetAddress().getHostAddress() + "---------->" +
// line);
// // System.out.println("服务器收到的信息:--------------" + line);
// } catch (IOException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// }
// } else {
// sockets.remove(socket);
// }
//
// }

/**
* 服务器发送的信息
*/
// public void write() {
// try {
// Set<String> keys = sockets.keySet();// socket对应的ip地址为iekey
// Iterator<String> it = keys.iterator();
// while (it.hasNext()) {
// Socket socket = sockets.get(it.next());// 通过key(ip地址)得到对应socket
// OutputStream os = socket.getOutputStream();
// BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(os));
// String words = textArea.getText();
// bw.write(words + "\n");
// bw.flush();
// }
// model.addElement("Server-----------------" + textArea.getText());
// textArea.setText("");// 清空
// } catch (IOException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// }
//
// }


package com.donghe.test;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.Socket;

public class MyServerReadThread implements Runnable{//线程
private Socket socket;
private MyServer myserver;
public MyServerReadThread(Socket socket,MyServer myserver){
this.socket=socket;
this.myserver=myserver;
}

@Override
public void run() {
// TODO Auto-generated method stub
while(true){
try {
InputStream is=socket.getInputStream();
InputStreamReader isr=new InputStreamReader(is);
BufferedReader br=new BufferedReader(isr);
String line=br.readLine();
myserver.readLine(line);//调用的是MyServer中的方法  与上面的br.readLine()不一样    调用方法的同时将信息显示到了JList中

} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

}
}

}


package com.donghe.test;

import java.awt.BorderLayout;
import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.border.EmptyBorder;
import javax.swing.plaf.basic.DefaultMenuLayout;

import net.sf.json.JSONObject;

import javax.swing.DefaultListModel;
import javax.swing.JButton;
import javax.swing.JTextArea;
import javax.swing.JList;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Calendar;
import java.awt.event.ActionEvent;
import javax.swing.JTextField;
import javax.swing.JTable;
import javax.swing.JLabel;

public class MyClient extends JFrame {

private JPanel contentPane;
private Socket socket;
private JTextArea textArea;
private DefaultListModel<String> model;
private JList list;
private JTextField textField;

/**
* Launch the application.
*/
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
MyClient frame = new MyClient();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}

/**
* Create the frame.
*/
public MyClient() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 450, 300);
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
setContentPane(contentPane);
contentPane.setLayout(null);

JButton btnNewButton = new JButton("发送");
btnNewButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
String msg = createMessage();
write(msg);
}
});
btnNewButton.setBounds(314, 216, 93, 36);
contentPane.add(btnNewButton);

textArea = new JTextArea();
textArea.setBounds(10, 216, 283, 36);
// contentPane.add(textArea);

/**
* 添加滚动条
*/
JScrollPane scroll2 = new JScrollPane(textArea);
scroll2.setBounds(10, 216, 283, 36);
contentPane.add(scroll2);
textArea.setSelectionEnd(textArea.getText().length());
/**
* 回车发送功能
*/
textArea.addKeyListener(new KeyListener() {

@Override
public void keyTyped(KeyEvent e) {
// TODO Auto-generated method stub
if (e.getKeyChar() == KeyEvent.VK_ENTER) {
String msg = createMessage();
write(msg);
}
}

@Override
public void keyReleased(KeyEvent e) {
// TODO Auto-generated method stub

}

@Override
public void keyPressed(KeyEvent e) {
// TODO Auto-generated method stub

}
});

list = new JList();
list.setBounds(10, 10, 283, 196);
model = new DefaultListModel<>();
list.setModel(model);
// list.setSelectionEnd(list.);//输入的时候滚动条会跟随滚动
JScrollPane scroll = new JScrollPane(list);
scroll.setBounds(32, 10, 261, 183);
scroll.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);// 竖直滚动条
scroll.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);// 水平滚动条
contentPane.add(scroll);

JButton btnNewButton_1 = new JButton("连接服务器");
btnNewButton_1.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
try {
System.out.println("连接服务器");
socket = new Socket("192.168.0.52", 8080);
System.out.println("服务器连接成功");

Thread t = new Thread(new MyClientReadThread(MyClient.this, socket));
t.start();
} catch (UnknownHostException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}

}
});
btnNewButton_1.setBounds(314, 26, 93, 44);
contentPane.add(btnNewButton_1);

textField = new JTextField();
textField.setBounds(320, 185, 87, 21);
contentPane.add(textField);
textField.setColumns(10);

JLabel lblTo = new JLabel("to");
lblTo.setBounds(303, 188, 12, 15);
contentPane.add(lblTo);
}
JSONObject obj = new JSONObject();
public String createMessage() {
String msg = textArea.getText();

obj.put("message", msg);
obj.put("type", "toSingle");
Calendar calendar = Calendar.getInstance();
long time = calendar.getTimeInMillis();
obj.put("time", "" + time);// 将long类型的时间转换成字符串
obj.put("from", socket.getInetAddress().getHostAddress());// 发送者的ip地址
obj.put("to", textField.getText());// 你希望发给谁的ip地址 手动输入 JTextField 输入一行
System.out.println(obj.toString());
return obj.toString();// 字符串形式
}

public void readLine(String line) {
JSONObject obj = JSONObject.fromObject(line);
String time = obj.getString("time");
long time1 = Long.parseLong(time);// 字符串转换成long类型

String msg = obj.getString("message");
String from = obj.getString("from");
String to = obj.getString("to");
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(time1);
model.addElement(calendar.get(Calendar.YEAR) + "/" + calendar.get(Calendar.MONTH) + "/"
+ calendar.get(Calendar.DAY_OF_MONTH) + "     " + calendar.get(Calendar.HOUR_OF_DAY) + ":"
+ calendar.get(Calendar.MINUTE) + ":" + calendar.get(Calendar.SECOND) + "     " + from + "对" + to + "说"
+ msg);

// try {
// InputStream is = socket.getInputStream();
// BufferedReader br = new BufferedReader(new InputStreamReader(is));
// String line1 = br.readLine();
// model.addElement(socket.getInetAddress().getHostAddress()+"->" +
// line1);// 显示到JList
// // System.out.println(line);
// } catch (IOException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// }

}

/**
* 发送给服务器
*/
public void write(String msg) {
try {
OutputStream os = socket.getOutputStream();
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(os));
// String words = textArea.getText();
bw.write(msg + "\n");
Calendar calendar = Calendar.getInstance();
model.addElement(calendar.get(Calendar.YEAR) + "/" + calendar.get(Calendar.MONTH) + "/"
+ calendar.get(Calendar.DAY_OF_MONTH) + "     " + calendar.get(Calendar.HOUR_OF_DAY) + ":"
+ calendar.get(Calendar.MINUTE) + ":" + calendar.get(Calendar.SECOND) + "     " +socket.getInetAddress().getHostAddress() + "☞☞☞☞☞说" + textArea.getText());
textArea.setText("");// 清空
bw.flush();

} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

}
}


package com.donghe.test;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;

public class MyClientReadThread implements Runnable{
private MyClient myclient;
private Socket socket;
public MyClientReadThread(MyClient myclient,Socket socket){
this.myclient=myclient;
this.socket=socket;
}
@Override
public void run() {
// TODO Auto-generated method stub
while(true){//一直在读
try {
BufferedReader br=new BufferedReader(new InputStreamReader(socket.getInputStream()));
String line=br.readLine();
myclient.readLine(line);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: