欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

關(guān)于java1.8源代碼的信息

java源代碼分析----jvm.dll裝載過程

簡述 眾所周知java exe是java class文件的執(zhí)行程序 但實際上java exe程序只是一個執(zhí)行的外殼 它會裝載jvm dll(windows下 以下皆以windows平臺為例 linux下和solaris下其實類似 為 libjvm so) 這個動態(tài)連接庫才是java虛擬機的實際操作虧察磨處理所在 本文探究java exe程序是如何查找和裝載jvm dll動態(tài)庫 并調(diào)用它進行class文件執(zhí)行處理的 源代碼 本文分析之代碼 《JavaTM SDK Standard Edition v fcsCommunity Source Release》 可從sunguan方網(wǎng)站下載 主要分析的源代碼為 j se\src\share\bin\java cj se\src\windows\bin\java_md c java c是什么東西 java程序 源代碼所謂 java程序 包括jdk中的java exe\javac exe\javadoc exe java c源代碼中通過JAVA_ARGS宏來控制生成的代碼 如果該宏沒定義則編譯文件控制生成java exe否則編譯文件控制生成其他的 java程序 比如 j se\make\java\javac\Makefile(這是javac編譯文件)中 $(CD) / /sun/javac ; $(MAKE) $@ RELEASE=$(RELEASE) FULL_VERSION=$(FULL_VERSION)j se\make\sun\javac\javac\Makefile(由上面Makefile文件調(diào)用)中 JAVA_ARGS = { \ J ms m\ \ sun tools javac Main\ } 則由同一份java c代碼生成的javac exe程序就會直接調(diào)用java類方法 sun tools javac Main 這樣使其執(zhí)行起來就像是直接運行的一個exe文件 而未定義JAVA_ARGS的java exe程序則會調(diào)用傳遞過來參數(shù)中的類方法 從java c的main入口函數(shù)說起 main()函數(shù)中前面一段為重新分配參數(shù)指針的處理 然后調(diào)用函數(shù) CreateExecutionEnvironment 該函數(shù)主要查找java運行環(huán)境的目錄 和jvm dll這個虛擬機核心動態(tài)連接庫文件路徑所在 根據(jù)操作系統(tǒng)不同 該函數(shù)有不同實現(xiàn)版本 但大體處理邏輯相同 我們看看windows平臺該函數(shù)的處理沒廳(j se\src\windows\bin\java_md c) CreateExecutionEnvironment函數(shù)主要分為三步處理 a 查找jre路徑 b 裝載jvm cfg中指定的虛擬機動態(tài)連接庫(jvm dll)參數(shù) c 取jvm dll文件路徑 實現(xiàn) a 查找jre路徑是通過java_md c中函數(shù) GetJREPath實現(xiàn)的 該函數(shù)首先調(diào)用GetApplicationHome函數(shù) GetApplicationHome函數(shù)調(diào)用windowsAPI函數(shù)GetModuleFileName取java exe程序的絕對路徑 以我的jdk安裝路徑為例 為 D:\java\j sdk _ \bin\java exe 然后去掉文件名取絕對路徑為 D:\java\j sdk _ \bin 之后會在去掉最后一級目錄 現(xiàn)在絕對路徑為 D:\java\j sdk _ 然后GetJREPath函數(shù)繼續(xù)判斷剛剛?cè)〉穆窂?\bin\java dll組合成的這個java dll文件是否存在 如果存在則 D:\java\j sdk _ 為JRE路徑 否則判斷取得的 D:\java\j sdk _ 路徑+\jre\bin\java dll文件是否存在 存在則 D:\java\j sdk _ \jre 為JRE路徑 如果上銷斗面兩種情況都不存在 則從注冊表中去查找(參見函數(shù)GetPublicJREHome) 函數(shù) GetPublicJREHome先查找 HKEY_LOCAL_MACHINE\Sofare\JavaSoft\Java Runtime Environment\CurrentVersion鍵值 當(dāng)前JRE版本號 判斷 當(dāng)前JRE版本號 是否為 做為版本號 如果是則取HKEY_LOCAL_MACHINE\Sofare\JavaSoft\Java Runtime Environment\ 當(dāng)前JRE版本號 \JavaHome的路徑所在為JRE路徑 我的JDK返回的JRE路徑為 D:\java\j sdk _ \jre b 裝載jvm cfg虛擬機動態(tài)連接庫配置文件是通過java c中函數(shù):ReadKnownVMs實現(xiàn)的 該函數(shù)首先組合jvm cfg文件的絕對路徑 JRE路徑+\lib+\ARCH(CPU構(gòu)架)+\jvm cfgARCH(CPU構(gòu)架)的判斷是通過java_md c中GetArch函數(shù)判斷的 該函數(shù)中windows平臺只有兩種情況 WIN 的 ia 其他情況都為 i 我的為i 所以jvm cfg文件絕對路徑為 D:\java\j sdk _ \jre\lib\i \jvm cfg 文件內(nèi)容如下 ## @(#)jvm cfg  / / # # Copyright Sun Microsystems Inc All rights reserved # SUN PROPRIETARY/CONFIDENTIAL Use is subject to license terms # # ### List of JVMs that can be used as an option to java javac etc # Order is important first in this list is the default JVM # NOTE that this both this file and its format are UNSUPPORTED and# WILL GO AWAY in a future release ## You may also select a JVM in an arbitrary location with the# XXaltjvm=jvm_dir option but that too is unsupported# and may not be available in a future release # client KNOWN server KNOWN hotspot ALIASED_TO client classic WARN native ERROR green ERROR(如果細心的話 我們會發(fā)現(xiàn)在JDK目錄中我的為 D:\java\j sdk _ \jre\bin\client 和 D:\java\j sdk _ \jre\bin\server 兩個目錄下都存在jvm dll文件 而java正是通過jvm cfg配置文件來管理這些不同版本的jvm dll的 )ReadKnownVMs函數(shù)會將該文件中的配置內(nèi)容讀入到一個JVM配置結(jié)構(gòu)的全局變量中 該函數(shù)首先跳過注釋(以 # 開始的行) 然后讀取以 開始的行指定的jvm參數(shù) 每一行為一個jvm信息 第一部分為jvm虛擬機名稱 第二部分為配置參數(shù) 比如行 client KNOWN 則 client 為虛擬機名稱 而 KNOWN 為配置類型參數(shù) KNOWN 表示該虛擬機的jvm dll存在 而 ALIASED_TO 表示為另一個jvm dll的別名 WARN 表示該虛擬機的jvm dll不存在但運行時會用其他存在的jvm dll替代執(zhí)行 而 ERROR 同樣表示該類虛擬機的jvm dll不存在且運行時不會找存在的jvm dll替代而直接拋出錯誤信息 在運行java程序時指定使用那個虛擬機的判斷是由java c中函數(shù) CheckJvmType判斷 該函數(shù)會檢查java運行參數(shù)中是否有指定jvm的參數(shù) 然后從ReadKnownVMs函數(shù)讀取的jvm cfg數(shù)據(jù)結(jié)構(gòu)中去查找 從而指定不同的jvm類型(最終導(dǎo)致裝載不同jvm dll) 有兩種方法可以指定jvm類型 一種按照jvm cfg文件中的jvm名稱指定 第二種方法是直接指定 它們執(zhí)行的方法分別是 java Jjvm cfg中jvm名稱 java XXaltjvm=jvm類型名稱 或 java J XXaltjvm=jvm類型名稱 如果是第一種參數(shù)傳遞方式 CheckJvmType函數(shù)會取參數(shù) J 后面的jvm名稱 然后從已知的jvm配置參數(shù)中查找如果找到同名的則去掉該jvm名稱前的 直接返回該值 而第二種方法 會直接返回 XXaltjvm= 或 J XXaltjvm= 后面的jvm類型名稱 如果在運行java時未指定上面兩種方法中的任一一種參數(shù) CheckJvmType會取配置文件中第一個配置中的jvm名稱 去掉名稱前面的 返回該值 CheckJvmType函數(shù)的這個返回值會在下面的函數(shù)中匯同jre路徑組合成jvm dll的絕對路徑 比如 如果在運行java程序時使用 java J client test 則ReadKnownVMs會讀取參數(shù) client 然后查找jvm cfg讀入的參數(shù)中是否有jvm名稱為 client 的 如果有則去掉jvm名稱前的 直接返回 client 而如果在運行java程序時使用如下參數(shù) java XXaltjvm=D:\java\j sdk _ \jre\bin\client test 則ReadKnownVMs會直接返回 D:\java\j sdk _ \jre\bin\client 如果不帶上面參數(shù)執(zhí)行如 java test 因為在jvm cfg配置文件中第一個存在的jvm為 client 所以函數(shù)ReadKnownVMs也會去掉jvm名稱前的 返回 client 其實這三中情況都是使用的 D:\java\j sdk _ \jre\bin\client\jvm dll 這個jvm動態(tài)連接庫處理test這個class的 見下面GetJVMPath函數(shù) c 取jvm dll文件路徑是通過java_md c中函數(shù) GetJVMPath實現(xiàn)的 由上面兩步我們已經(jīng)獲得了JRE路徑和jvm的類型字符串 GetJVMPath函數(shù)判斷CheckJvmType返回的jvm類型字符串中是否包含了 \ 或 / 如果包含則以該jvm類型字符串+\jvm dll作為JVM的全路徑 否則以JRE路徑+\bin+\jvm類型字符串+\jvm dll作為JVM的全路徑 看看上面的例子 第一種情況 java J client test jvm dll路徑為 JRE路徑+\bin+\jvm類型字符串+\jvm dll 按照我的JDK路徑則為 D:\java\j sdk _ \jre + \bin + \client + \jvm dll 第二種情況 java XXaltjvm=D:\java\j sdk _ \jre\bin\client test 路徑為 jvm類型字符串+\jvm dll即為 D:\java\j sdk _ \jre\bin\client + \jvm dll 第三種情況 java test 為 D:\java\j sdk _ \jre + \bin + \client + \jvm dll 與情況一相同 所以這三種情況都是調(diào)用的jvm動態(tài)連接庫 D:\javaj sdk _ \jre\bin\client\jvm dll 處理test類的 我們來進一步驗證一下 打開cmd控制臺 設(shè)置java裝載調(diào)試E:\work\java_researchset _JAVA_LAUNCHER_DEBUG= 情況一E:\work\java_researchjava J client test ScanDirectory _JAVA_LAUNCHER_DEBUG lishixinzhi/Article/program/Java/hx/201311/26750

成都創(chuàng)新互聯(lián)專注于新鄉(xiāng)縣企業(yè)網(wǎng)站建設(shè),響應(yīng)式網(wǎng)站設(shè)計,購物商城網(wǎng)站建設(shè)。新鄉(xiāng)縣網(wǎng)站建設(shè)公司,為新鄉(xiāng)縣等地區(qū)提供建站服務(wù)。全流程定制制作,專業(yè)設(shè)計,全程項目跟蹤,成都創(chuàng)新互聯(lián)專業(yè)和態(tài)度為您提供的服務(wù)

請問能不能幫我寫一個Java的聊天窗口文件源代碼,不要很復(fù)雜,只要能運行,聊天就行了!我用淘寶金幣換,謝

話說網(wǎng)上真的好多啊...

package client;

import java.awt.Color;

import java.awt.Container;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;

import java.awt.event.WindowAdapter;

import java.awt.event.WindowEvent;

import java.io.DataInputStream;

import java.io.DataOutputStream;

import java.io.IOException;

import java點虐 .Socket;

import java.util.Date;

import javax.swing.JButton;

import javax.swing.JFrame;

import javax.swing.JOptionPane;

import javax.swing.JScrollPane;

import javax.swing.JTextArea;

import javax.swing.JTextField;

public class ClientFrame extends JFrame{

private JTextArea allmsg;

private JTextField welcome,copyright,chatmsg;

private JButton send;

private JScrollPane js;

private boolean isConnected = true;

public DataOutputStream out;

public DataInputStream in;

public Socket s = null;

String nic; /* -- 保存用戶昵稱 --*/

/**

* 初始化客戶端資源

* 1.獲取從LoginFrame傳遞過來的參數(shù)

* 2.初始化界面元素

* 3.初始化通信所需要的資源 EG:輸入/輸出流(DataInputStream/DataOutputStream)

* */察稿猛

public ClientFrame(String name,Socket socket)

{

this.setSize(310,660);

this.setLocation(290,50);

this.setTitle("聊天室客戶端"+name+""敗橋);/* -- 指定窗口的標(biāo)題 --*/

this.s = socket;/* -- 接收從LoginFrame中傳遞過來的Socket --*/

this.nic = name+" 說: ";

welcome = new JTextField(" "+name+" 歡迎您來到聊天室 ",100);

welcome.setBackground(Color.blue);

welcome.setEnabled(false);

copyright = new JTextField(" ----- all copyright @ TOP-king -----");

copyright.setEnabled(false);

allmsg = new JTextArea();

allmsg.setEditable(false);

allmsg.append(" 系統(tǒng)消息: 歡迎登錄在線聊天室敬鏈 \n");

js = new JScrollPane(allmsg);//為JTextArea添加滾動條

chatmsg = new JTextField("在此輸入聊天信息");

chatmsg.addActionListener(new listen());

send = new JButton("發(fā)送");

send.addActionListener(new listen());/* -- 添加事件監(jiān)聽器 --*/

try {

out = new DataOutputStream(s.getOutputStream());

in = new DataInputStream(s.getInputStream());

} catch (IOException e) {JOptionPane.showMessageDialog(null, "系統(tǒng)異常","錯誤",JOptionPane.OK_CANCEL_OPTION);}

addcomponettocontainer();

/* -- 當(dāng)用戶關(guān)閉窗口時進行相關(guān)的處理 eg:Socket Data(Input/Output)Stream 的關(guān)閉--*/

this.addWindowListener(new WindowAdapter(){

public void windowClosing(WindowEvent we)

{

sendmsg("quitlogout");/* -- 向服務(wù)器端發(fā)送關(guān)閉信息 --*/

isConnected = false;

destory();/* -- 銷毀窗口資源 --*/

}

});

new Thread(new linread()).start();/* -- 啟動讀取信息線程 --*/

}

public void addcomponettocontainer()

{

Container c = this.getContentPane();

c.setLayout(null);

welcome.setBounds(75,10,150,20);

js.setBounds(10,50,280,500);

chatmsg.setBounds(10,560,180,30);

send.setBounds(220,560,70,30);

copyright.setBounds(10,600,280,20);

c.add(welcome);

c.add(js);

c.add(chatmsg);

c.add(send);

c.add(copyright);

this.setVisible(true);

this.setResizable(false);

}

class listen implements ActionListener

{

public void actionPerformed(ActionEvent e) {

// TODO Auto-generated method stub

if(e.getSource()==send||e.getSource()==chatmsg)

{

String msg = chatmsg.getText().trim();

if("".equals(msg))

{

JOptionPane.showMessageDialog(null,"發(fā)送信息不能為空!","錯誤",JOptionPane.OK_OPTION);

}

else

{sendmsg((new Date()).toLocaleString()+"\n"+nic+msg+"\n");chatmsg.setText("");}

}

}

}

/* -- 向服務(wù)器端發(fā)送信息 --*/

public void sendmsg(String m)

{

if(isConnected)//如果socket的輸出流沒關(guān)閉

{

try {

out.writeUTF(m);

} catch (IOException e) {

JOptionPane.showMessageDialog(null,"發(fā)送信息失敗!(系統(tǒng)異常)","錯誤",JOptionPane.OK_OPTION);

}

}

else

{

JOptionPane.showMessageDialog(null,"發(fā)送信息失敗!(服務(wù)器關(guān)閉/網(wǎng)絡(luò)故障)","錯誤",JOptionPane.OK_OPTION);

}

}

/* -- 讀取信息線程 --*/

class linread implements Runnable

{

public void run()

{

read();

}

public void read()

{

while(isConnected)

{

try {

String msg = in.readUTF();

if("SYSTEM_CLOSED".equals(msg))

{

JOptionPane.showMessageDialog(null,"讀取消息失敗(服務(wù)器關(guān)閉/網(wǎng)絡(luò)故障)!","錯誤",JOptionPane.OK_OPTION);

isConnected = false;

}

else

allmsg.append(msg+"\n");

} catch (IOException e) {

}

}//end while

JOptionPane.showMessageDialog(null,"讀取消息失敗(服務(wù)器關(guān)閉/網(wǎng)絡(luò)故障)!","錯誤",JOptionPane.OK_OPTION);

}//end read()

}

public void destory()

{

try {

this.out.close();

this.in.close();

this.s.close();

} catch (IOException e) {

}

this.dispose();

}

}

======================================================

package client;

import java.awt.*;

import javax.swing.*;

import java.awt.event.*;

import java.io.*;

import java點虐 .*;

public class LoginFrame extends JFrame{

private JTextField name;

private JTextField ip;

private JButton ok,cancle;

public Socket socket;

public LoginFrame()

{

super("登錄框");

this.setSize(400,80);

this.setLocation(100,100);

name = new JTextField("昵稱");

ip = new JTextField("127.0.0.1");

ok = new JButton("登錄");

cancle = new JButton("取消");

ok.addActionListener(new listenEvent());

cancle.addActionListener(new listenEvent());

//建立容器

addcomponettocontainer();

this.setDefaultCloseOperation(EXIT_ON_CLOSE);

}

/**

* 建立容器及控件

*/

public void addcomponettocontainer()

{

Container c = this.getContentPane();

c.setLayout(null);

name.setBounds(10,10,100,30);

ip.setBounds(120,10,100,30);

ok.setBounds(230,10,70,30);

cancle.setBounds(310,10,70,30);

c.add(name);

c.add(ip);

c.add(ok);

c.add(cancle);

this.setVisible(true);

this.setResizable(false);

}

public class listenEvent implements ActionListener

{

public void actionPerformed(ActionEvent event) {

// TODO Auto-generated method stub

if(event.getSource()==ok)

{

String n = name.getText().trim();

String i = ip.getText().trim();

if("".equals(n)||"".equals(i))

{

JOptionPane.showMessageDialog(null,"昵稱、IP不能夠為空!","錯誤",JOptionPane.OK_OPTION);

}

else{login(n,i);}

}

if(event.getSource()==cancle)

{

name.setText("");

ip.setText("");

}

}

}

/**

* 進行登錄

* @param name

* @param ip

*/

public void login(String name,String ip)

{

try {

socket = new Socket(ip,7777);

DataOutputStream out = new DataOutputStream(socket.getOutputStream());

out.writeUTF(name);

out.flush();//強制輸出緩存中的內(nèi)容

//out.close();

new ClientFrame(name,socket);

destroywindow();

} catch (UnknownHostException e) {

JOptionPane.showMessageDialog(null,"找不到主機地址(IP錯誤/網(wǎng)絡(luò)故障)!","錯誤",JOptionPane.OK_OPTION);

} catch (IOException e) {

}

}

public void destroywindow()

{

this.dispose();

}

public static void main(String[] args)

{

new LoginFrame();

}

}

==================================================

package server;

import java.awt.Container;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;

import java.awt.event.WindowAdapter;

import java.awt.event.WindowEvent;

import java.io.DataInputStream;

import java.io.DataOutputStream;

import java.io.IOException;

import java點虐 .ServerSocket;

import java點虐 .Socket;

import java.util.ArrayList;

import java.util.Date;

import javax.swing.JButton;

import javax.swing.JFrame;

import javax.swing.JOptionPane;

import javax.swing.JScrollPane;

import javax.swing.JTextArea;

import javax.swing.JTextField;

public class ServerFrame extends JFrame{

/**

*

*/

private static final long serialVersionUID = 1L;

private JTextArea allmsg;

private JTextField currnum,totalnum,copyright,chatmsg;

private JButton send;

private JScrollPane js;

int num1,num2,port;/* -- num1:當(dāng)前在線人數(shù) num2:總上線人數(shù) port:服務(wù)端口號 --*/

private ServerSocket ss;

ArrayListuser lists;//存放所有在線用戶

public ServerFrame()

{

super("聊天室服務(wù)器端");

this.setSize(310,660);

this.setLocation(200,50);

lists = new ArrayListuser();

num1 = num2 =0;

port = 7777;

currnum = new JTextField(" 當(dāng)前在線人數(shù): "+num1);

currnum.setEnabled(false);

totalnum = new JTextField(" 上線總?cè)藬?shù): "+num2);

totalnum.setEnabled(false);

copyright = new JTextField(" ----- all copyright @ TOP-king -----");

copyright.setEnabled(false);

allmsg = new JTextArea();

allmsg.append(" --------------- 系統(tǒng)消息 --------------\n");

allmsg.setEditable(false);

allmsg.setLineWrap(true); //允許自動換行

js = new JScrollPane(allmsg);//為JTextArea添加滾動條

chatmsg = new JTextField("在此輸入系統(tǒng)信息");

chatmsg.addActionListener(new ActionListener(){

@SuppressWarnings("deprecation")

public void actionPerformed(ActionEvent arg0) {

String str = chatmsg.getText().trim();

if(!"".equals(str))

{sendmsg((new Date()).toLocaleString()+" -- 系統(tǒng)消息: "+str);chatmsg.setText("");}

else

JOptionPane.showMessageDialog(null, "消息不能為空","錯誤",JOptionPane.OK_OPTION);

chatmsg.setText("");/* -- 發(fā)送信息后,將輸入欄中的信息清空 -- */

}

});

send = new JButton("發(fā)送");

send.addActionListener(new ActionListener(){

@SuppressWarnings("deprecation")

public void actionPerformed(ActionEvent arg0) {

String str = chatmsg.getText().trim();

if(!"".equals(str))

{sendmsg((new Date()).toLocaleString()+" -- 系統(tǒng)消息: "+str);chatmsg.setText("");}

else

JOptionPane.showMessageDialog(null, "消息不能為空","錯誤",JOptionPane.OK_OPTION);

chatmsg.setText("");/* -- 發(fā)送信息后,將輸入欄中的信息清空 -- */

}

});

//建立容器

addcomponettocontainer();

this.addWindowListener(new WindowAdapter(){

public void windowClosing(WindowEvent we)

{

sendmsg("SYSTEM_CLOSED");/* -- 向客戶端發(fā)送服務(wù)器關(guān)閉信息 -- */

destory();

}

});

start(); /* -- 啟動連接服務(wù) -- */

}

public void addcomponettocontainer()

{

//Container建立容器

Container c = this.getContentPane();

c.setLayout(null);

currnum.setBounds(20,15,130,20);

totalnum.setBounds(155,15,125,20);

js.setBounds(10,50,280,500);

chatmsg.setBounds(10,560,180,30);

send.setBounds(220,560,70,30);

copyright.setBounds(10,600,280,20);

c.add(currnum);

c.add(totalnum);

c.add(js);

c.add(chatmsg);

c.add(send);

c.add(copyright);

this.setVisible(true);

this.setResizable(false);

}

/**

* start()方法監(jiān)聽客戶的連接

* 并且保存客戶端的相關(guān)信息EG:用戶昵稱、用戶所使用的Socket

* 用戶連接到服務(wù)器成功之后,將其保存到用戶列表中,并為該用戶啟動一個線程用于通信 */

@SuppressWarnings("deprecation")

public void start()

{

boolean isStarted = false;/* -- 用于標(biāo)記服務(wù)器是否已經(jīng)正常啟動 -- */

try {

this.ss = new ServerSocket(port);

isStarted = true;

this.allmsg.append((new Date()).toLocaleString()+" 服務(wù)器啟動 @ 端口: "+port+"\n");

while(isStarted)

{

Socket client = this.ss.accept(); /* -- 監(jiān)聽客戶端的連接 -- */

DataInputStream in = new DataInputStream(client.getInputStream());

String name = in.readUTF();

user u = new user();

u.name = name;

u.socket = client;

lists.add(u); //將該用戶加到列表中去

num1++;

num2++;

currnum.setText(" 當(dāng)前在線人數(shù): "+num1);

totalnum.setText(" 上線總?cè)藬?shù): "+num2);

this.allmsg.append((new Date()).toLocaleString()+" : "+u.name+" 登錄 \n");

new Thread(new ClientThread(u)).start();/* -- 為該用戶啟動一個通信線程 -- */

}

} catch (IOException e) {

System.out.println("服務(wù)器已經(jīng)啟動......");

System.exit(0);

}

}

/**

* 通信線程主要功能包括:

* 1.監(jiān)聽客戶端輸入的信息

* 2.將接收到的信息轉(zhuǎn)發(fā)給其他用戶 */

class ClientThread implements Runnable

{

user user = null;

boolean isConnected = true;

DataInputStream dis = null;

DataOutputStream dos = null;

public ClientThread(user u)

{

this.user = u;

try {

this.dis = new DataInputStream(this.user.socket.getInputStream());

this.dos = new DataOutputStream(this.user.socket.getOutputStream());

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

public void run()

{

readmsg();

}

/* -- 讀取客戶的聊天信息 -- */

@SuppressWarnings("deprecation")

public void readmsg()

{

while(isConnected)

{

try {

String msg = dis.readUTF();

if("quitlogout".equals(msg))//當(dāng)用戶關(guān)閉客戶端窗口時,發(fā)送quit字符串 表示用戶已經(jīng)退出

{

num1--;

try{

this.dis.close();

this.dos.close();

this.user.socket.close();

this.isConnected = false;

}catch(IOException ioe)

{

ioe.printStackTrace();

}finally{

this.isConnected = false;

if(dis!=null) this.dis.close();

if(dos!=null) this.dos.close();

if(this.user.socket!=null) this.user.socket.close();

}

lists.remove(this.user);//從列表中刪除該用戶

currnum.setText(" 當(dāng)前在線人數(shù): "+num1);

allmsg.append((new Date()).toLocaleString()+" : "+this.user.name+" 退出\n");

}

else

sendmsg(msg);

} catch (IOException e) {

e.printStackTrace();

}

}

}

}

/* -- 將信息進行轉(zhuǎn)發(fā) -- */

public void sendmsg(String msg)

{

user us = new user();

DataOutputStream os = null;

if(lists.size()0)

{

for(int i=0;ilists.size();i++)

{

us = lists.get(i);

try {

os = new DataOutputStream(us.socket.getOutputStream());

os.writeUTF(msg);

} catch (IOException e) {

e.printStackTrace();

}

}

}

else

JOptionPane.showMessageDialog(null, "當(dāng)前無用戶在線。發(fā)送消息失敗","失敗",JOptionPane.OK_OPTION);

}

public void destory()

{

try {

this.ss.close();

} catch (IOException e) {

e.printStackTrace();

}

this.dispose();

}

public static void main(String[] args)

{

new ServerFrame();

}

}

=================================================

package server;

import java點虐 .*;

public class user {

String name;

Socket socket;

}

java源代碼,找不出錯誤```有5處,大俠幫我找找啊```

都是run函數(shù)里的錯誤

public void run() {

do {

try {

repaint();

Thread.sleep(50L);

} catch (InterruptedException ex) {/敏巖/這句原來是羨拿巖錯的 現(xiàn)在對了 原來ex前邊有個"_"

stop();

}

}

while (true) ;{//兄御這個引號在那里是對的 但是我不知道這句你寫出來有什么用呢?

}

}

文章名稱:關(guān)于java1.8源代碼的信息
文章分享:http://chinadenli.net/article4/dshodoe.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供Google關(guān)鍵詞優(yōu)化網(wǎng)站設(shè)計外貿(mào)建站自適應(yīng)網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

手機網(wǎng)站建設(shè)