基于internet的java聊天程序
嗯,我想做的基本上是,制作一个可以在互联网上运行的客户机-服务器聊天程序,我做了一个基本的程序,它可以在局域网上完美地运行,但不能在互联网上正常运行 服务器:基于internet的java聊天程序,java,serversocket,tcp-ip,Java,Serversocket,Tcp Ip,嗯,我想做的基本上是,制作一个可以在互联网上运行的客户机-服务器聊天程序,我做了一个基本的程序,它可以在局域网上完美地运行,但不能在互联网上正常运行 服务器: public class Server extends javax.swing.JFrame { HashMap<String,PrintWriter> map = new HashMap<String,PrintWriter>(); ArrayList clientOutputStreams = new A
public class Server extends javax.swing.JFrame {
HashMap<String,PrintWriter> map = new HashMap<String,PrintWriter>();
ArrayList clientOutputStreams = new ArrayList();
ArrayList<String> onlineUsers = new ArrayList();
int port = 5080;
Socket clientSock = null;
public class ClientHandler implements Runnable {
BufferedReader reader;
Socket sock;
PrintWriter client;
public ClientHandler(Socket clientSocket, PrintWriter user) {
// new inputStreamReader and then add it to a BufferedReader
client = user;
try {
sock = clientSocket;
InputStreamReader isReader = new InputStreamReader(sock.getInputStream());
reader = new BufferedReader(isReader);
System.out.println("first");
} // end try
catch (Exception ex) {
System.out.println("error beginning StreamReader");
} // end catch
} // end ClientHandler()
@Override
public void run() {
System.out.println("run method is running");
String message;
String[] data;
String connect = "Connect";
String disconnect = "Disconnect";
String chat = "Chat";
try {
while ((message = reader.readLine()) != null) {
ta1.append(message + "\n");
ta1.repaint();
System.out.println("Received: " + message);
data = message.split("#");
for (String token : data) {
System.out.println(token);
}
System.out.println(data[data.length - 1] + " datalast");
if (data[2].equals(connect)) {
tellEveryone((data[0] + "#" + data[1] + "#" + chat));
userAdd(data[0]);
map.put(data[0], client);
} else if (data[2].equals(disconnect)) {
System.out.println("barpppppppppp");
tellEveryone((data[0] + "#has disconnected." + "#" + chat));
userRemove(data[0]);
map.remove(data[0]);
} else if (data[2].equals(chat)) {
tellEveryone(message);
} else {
System.out.println("No Conditions were met.");
}
} // end while
} // end try
catch (Exception ex) {
System.out.println("lost a connection");
System.out.println(ex.getMessage());
clientOutputStreams.remove(client);
} // end catch
} // end run()
}
public void go() {
// clientOutputStreams = new ArrayList();
try {
ServerSocket serverSock = new ServerSocket(port);
System.out.println("ServerSocket Created !");
System.out.println("Started listening to port " + port);
while (true) {
// set up the server writer function and then begin at the same
// the listener using the Runnable and Thread
clientSock = serverSock.accept();
PrintWriter writer = new PrintWriter(clientSock.getOutputStream());
ta1.append(writer + " ");
ta1.repaint();
System.out.println(writer);
clientOutputStreams.add(writer);
//data_of_names_and_output_streams.add(writer.toString());
// use a Runnable to start a 'second main method that will run
// the listener
Thread listener = new Thread(new Server.ClientHandler(clientSock, writer));
listener.start();
System.out.println("Server Thread for 'new player' was started");
System.out.println("got a connection");
} // end while
} // end try
catch (Exception ex) {
System.out.println("error making a connection");
} // end catch
} // end go()
public void userAdd(String data) {
String message;
String add = "# #Connect", done = "Server# #Done";
onlineUsers.add(data);
String[] tempList = new String[(onlineUsers.size())];
onlineUsers.toArray(tempList);
for (String token : tempList) {
message = (token + add);
tellEveryone(message);
System.out.println(message);
}
tellEveryone(done);
}
public void userRemove(String data) {
System.out.println(onlineUsers.size() + " is size of online users");
System.out.println(clientOutputStreams.size() + " is size of ous");
String message;
String add = "# #Connect", done = "Server# #Done";
onlineUsers.remove(data);
String[] tempList = new String[(onlineUsers.size())];
onlineUsers.toArray(tempList);
for (String token : tempList) {
message = (token + add);
tellEveryone(message);
}
tellEveryone(done);
}
public void tellEveryone(String message) {
System.out.println(onlineUsers.size() + " is size of online users");
System.out.println(clientOutputStreams.size() + " is size of ous");
// jButton1.doClick();
// sends message to everyone connected to server
Iterator it = clientOutputStreams.iterator();
if (message.length() < 250) {
System.out.println("inside it");
while (it.hasNext()) {
try {
PrintWriter writer = (PrintWriter) it.next();
writer.println(message);
// l1.setText(message);
System.out.println("Sending " + message);
writer.flush();
} // end try
catch (Exception ex) {
System.out.println("error telling everyone");
} // end catch
}
} else {
try {
clientSock.close();
} catch (IOException ex) {
Logger.getLogger(Server.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
/**
* Creates new form Server
*/
public Server() {
initComponents();
ta1.repaint();
}
public static void main(String args[]) throws Exception {
UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
/* Create and display the form */
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new Server().setVisible(true);
}
});
new Server().go();
}
} //end form
公共类服务器扩展了javax.swing.JFrame{
HashMap=newHashMap();
ArrayList clientOutputStreams=新的ArrayList();
ArrayList onlineUsers=新建ArrayList();
int端口=5080;
套接字clientSock=null;
公共类ClientHandler实现Runnable{
缓冲读取器;
插座;
PrintWriter客户端;
公共ClientHandler(套接字clientSocket,PrintWriter用户){
//新建inputStreamReader,然后将其添加到BufferedReader
客户=用户;
试一试{
sock=clientSocket;
InputStreamReader isReader=新的InputStreamReader(sock.getInputStream());
读卡器=新的BufferedReader(isReader);
System.out.println(“第一”);
}//结束尝试
捕获(例外情况除外){
System.out.println(“错误开始StreamReader”);
}//端盖
}//end ClientHandler()
@凌驾
公开募捐{
System.out.println(“run方法正在运行”);
字符串消息;
字符串[]数据;
String connect=“connect”;
String disconnect=“disconnect”;
String chat=“chat”;
试一试{
而((message=reader.readLine())!=null){
ta1.追加(message+“\n”);
ta1.repaint();
System.out.println(“接收:+消息”);
数据=message.split(“#”);
for(字符串标记:数据){
System.out.println(令牌);
}
System.out.println(数据[data.length-1]+“datalast”);
if(数据[2]。等于(连接)){
告诉每个人(数据[0]+“#”+数据[1]+“#”+聊天);
userAdd(数据[0]);
map.put(数据[0],客户端);
}else if(数据[2]。等于(断开连接)){
System.out.println(“barpppppppp”);
告诉所有人((数据[0]+“#已断开连接。”+“#”+聊天));
userRemove(数据[0]);
map.remove(数据[0]);
}else if(数据[2]。等于(聊天)){
告诉每个人(信息);
}否则{
System.out.println(“未满足任何条件”);
}
}//结束时
}//结束尝试
捕获(例外情况除外){
System.out.println(“失去连接”);
System.out.println(例如getMessage());
clientOutputStreams.remove(客户端);
}//端盖
}//结束运行()
}
公开作废go(){
//clientOutputStreams=新的ArrayList();
试一试{
ServerSocket serverSock=新的ServerSocket(端口);
System.out.println(“ServerSocket已创建!”);
System.out.println(“开始侦听端口”+端口);
while(true){
//设置服务器编写器功能,然后同时开始
//使用Runnable和线程的侦听器
clientSock=serverSock.accept();
PrintWriter writer=新的PrintWriter(clientSock.getOutputStream());
ta1.追加(writer+“”);
ta1.repaint();
System.out.println(writer);
clientOutputStreams.add(writer);
//_name_和_output_streams.add(writer.toString())的数据_;
//使用Runnable启动将运行的“第二个主方法”
//听众
线程侦听器=新线程(newserver.ClientHandler(clientSock,writer));
listener.start();
System.out.println(“新玩家”的服务器线程已启动”);
System.out.println(“获得连接”);
}//结束时
}//结束尝试
捕获(例外情况除外){
System.out.println(“建立连接时出错”);
}//端盖
}//end go()
公共void userAdd(字符串数据){
字符串消息;
字符串add=“##连接”,done=“服务器##完成”;
在线用户。添加(数据);
String[]templast=新字符串[(onlineUsers.size())];
在线用户。toArray(圣殿骑士);
for(字符串标记:tempList){
消息=(令牌+添加);
告诉每个人(信息);
System.out.println(消息);
}
告诉所有人(完成);
}
公共void userRemove(字符串数据){
System.out.println(onlineUsers.size()+“是在线用户的大小”);
System.out.println(clientOutputStreams.size()+“是OU的大小”);
字符串消息;
字符串add=“##连接”,done=“服务器##完成”;
联机用户。删除(数据);
String[]templast=新字符串[(onlineUsers.size())];
在线用户。toArray(圣殿骑士);
for(字符串标记:tempList){
消息=(令牌+添加);
告诉每个人(信息);
}
告诉所有人(完成);
}
公共消息(字符串消息){
System.out.println(onlineUsers.size()+“是在线用户的大小”);
System.out.println(clientOutputStreams.size()+“是OU的大小”);
//jButton1.doClick();
//向连接到服务器的所有人发送消息
Iterator it=clientOutputStreams.Iterator();
if(message.length()<250){
System.out.println(“内部”);
while(it.hasNext()){
试一试{
PrintWriter=(PrintWriter)it.next();
writer.println(消息);
//l1.setText(消息);
System.out.println(“发送”+消息);
writer.flush();
}//结束尝试
捕获(例外情况除外){
System.out.println(“告诉所有人的错误”);
}//端盖
}
}否则{
试一试{
clientSock.close();
}捕获(IOEX异常){
Logger.getLogger(Server.class.getNam
public class Client extends javax.swing.JFrame {
boolean sent, receive;
SimpleDateFormat sdf;
String ip;
String username;
Socket sock;
BufferedReader reader;
PrintWriter writer;
ArrayList<String> userList = new ArrayList();
Boolean isConnected = false;
DefaultListModel dlm;
public Client() {
initComponents();
dlm = (DefaultListModel) l1.getModel();
ip = JOptionPane.showInputDialog("Enter the IP of the server to connect");
}
public class IncomingReader implements Runnable {
public void run() {
String stream;
String[] data;
String done = "Done", connect = "Connect", disconnect = "Disconnect", chat = "Chat", battlerequest = "battlerequest";
try {
while ((stream = reader.readLine()) != null) {
data = stream.split("#");
System.out.println(stream + " ------------------------ data");
if (data[2].equals(chat)) {
sdf = new SimpleDateFormat("HH:mm:ss");
t.append("(" + sdf.format(new Date()) + ") " + data[0] + ": " + data[1] + "\n");
//t.setText("<html><b>hi" + 3 + 3 + "</b></html>");
} else if (data[2].equals(connect)) {
t.removeAll();
userAdd(data[0]);
} else if (data[2].equals(disconnect)) {
userRemove(data[0]);
} else if (data[2].equals(done)) {
dlm.removeAllElements();
writeUsers();
userList.clear();
} else {
System.out.println("no condition met - " + stream);
}
}
} catch (Exception ex) {
System.out.println(ex.getMessage() + " hi");
}
}
}
public void ListenThread() {
Thread IncomingReader = new Thread(new Client.IncomingReader());
IncomingReader.start();
}
public void userAdd(String data) {
userList.add(data);
}
public void userRemove(String data) {
t.setText(t1.getText() + data + " has disconnected.\n");
}
public void writeUsers() {
String[] tempList = new String[(userList.size())];
userList.toArray(tempList);
for (String token : tempList) {
//ul.append( token + "\n");
dlm.addElement(token);
// ul.setText(ul.getText() + token + '\n');
}
}
public void sendDisconnect() {
String bye = (username + "# #Disconnect");
try {
writer.println(bye); // Sends server the disconnect signal.
writer.flush(); // flushes the buffer
} catch (Exception e) {
t.append("Could not send Disconnect message.\n");
}
}
public void Disconnect() {
try {
t.append("Disconnected.\n");
sock.close();
} catch (Exception ex) {
t.append("Failed to disconnect. \n");
}
isConnected = false;
n.setEditable(true);
dlm.removeAllElements();
// ul.setText("");
}
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
if (isConnected == false && !n.getText().equals("")) {
username = n.getText();
n.setEditable(false);
try {
sock = new Socket(ip, 5080);
InputStreamReader streamreader = new InputStreamReader(sock.getInputStream());
reader = new BufferedReader(streamreader);
writer = new PrintWriter(sock.getOutputStream());
writer.println(username + "#has connected.#Connect"); // Displays to everyone that user connected.
writer.flush(); // flushes the buffer
isConnected = true;
jLabel4.setText(n.getText());
//t.append( "<html><font color = \"black\"><b>Server : Welcome,</b></font></html>"+username);
//t1.setText("<html><font color=\"red\">yo</font></html>");
// Used to see if the client is connected.
} catch (Exception ex) {
t.append("Cannot Connect! Try Again. \n");
n.setEditable(true);
}
ListenThread();
} else if (isConnected == true) {
t.append("You are already connected. \n");
} else if (n.getText().equals("")) {
t.append("Enter a valid name \n");
}
}
private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {
String nothing = "";
if ((t1.getText()).equals(nothing)) {
t1.setText("");
t1.requestFocus();
} else {
try {
writer.println(username + "#" + t1.getText() + "#" + "Chat");
writer.flush(); // flushes the buffer
} catch (Exception ex) {
t.append("Message was not sent. \n");
}
t1.setText("");
t1.requestFocus();
}
t1.setText("");
t1.requestFocus(); // TODO add your handling code here:
}
private void dicsActionPerformed(java.awt.event.ActionEvent evt) {
sendDisconnect();
Disconnect(); // TODO add your handling code here:
}