(第一种情况) public void sendMessage(){
try {
System.out.println(str+"!first");
dos.writeUTF(str);
} catch (IOException e) {
e.printStackTrace();
}
}
public void run() {
try{
//接受客户端发送过来的信息,并读取信息
while(connect){
str=dis.readUTF();
//把信息发送给各个客户端
for(int i=0;i<clients.size();i++){
//实例化各个客户端
Client c1=clients.get(i);
c1.sendMessage();
}
}
(第二种情况) public void sendMessage(String str){
try {
System.out.println(str+"!first");
dos.writeUTF(str);
} catch (IOException e) {
e.printStackTrace();
}
}
public void run() {
try{
//接受客户端发送过来的信息,并读取信息
while(connect){
str=dis.readUTF();
//把信息发送给各个客户端
for(int i=0;i<clients.size();i++){
//实例化各个客户端
Client c1=clients.get(i);
c1.sendMessage(str);
}
}
(问题:为什么从客户端输入时。。输出的结果不同。是什么原理呢?)
try {
System.out.println(str+"!first");
dos.writeUTF(str);
} catch (IOException e) {
e.printStackTrace();
}
}
public void run() {
try{
//接受客户端发送过来的信息,并读取信息
while(connect){
str=dis.readUTF();
//把信息发送给各个客户端
for(int i=0;i<clients.size();i++){
//实例化各个客户端
Client c1=clients.get(i);
c1.sendMessage();
}
}
(第二种情况) public void sendMessage(String str){
try {
System.out.println(str+"!first");
dos.writeUTF(str);
} catch (IOException e) {
e.printStackTrace();
}
}
public void run() {
try{
//接受客户端发送过来的信息,并读取信息
while(connect){
str=dis.readUTF();
//把信息发送给各个客户端
for(int i=0;i<clients.size();i++){
//实例化各个客户端
Client c1=clients.get(i);
c1.sendMessage(str);
}
}
(问题:为什么从客户端输入时。。输出的结果不同。是什么原理呢?)
解决方案 »
- 如何将文本中的字段分解后导入SQL Server,恳请帮忙
- 这两种加载工程资源方法的区别
- JButton如何设置单击的效果
- JNI编译生成的.h文件中只有属性,没有方法!求解,在线等复!
- think in java 的所有代码,做成chm文件了,很方便收藏的,大家下载做的收藏吧
- 一个简单的数据库问题求看一下啊
- try{}catch(){}finally{}
- 用过java调用*.dll的 哥们帮我个问题,急急急急急急急!!!!!!!!!!!!
- 100大洋求java的开发规约!!大家帮帮忙.
- 菜鸟提问:java与c++在功能上有什么区别?java有什么优势?
- Enum继承接口不实现接口中方法通过编译
- 请教ResourceBundle资源文件路径问题
线程的执行是随机的,如果是多线程的话
从str=dis.readUTF(); 到c1.sendMessage(str);(或c1.sendMessage();)
不能保证str的一致,因为第一个线程刚要执行c1.sendMessage(str);的时候,另一个线程可能会执行str=dis.readUTF(); 这样,str就被改变了
import java.io.*;
import java.net.*;
import java.util.*;public class ChatServer01 { boolean connect=false;
ServerSocket ss=null;
List<Client> clients=new ArrayList<Client>();
public static void main(String[] args) {
new ChatServer01();
}
//定义构造函数
public ChatServer01(){
Socket s=null;
DataInputStream dis=null;
try {
ss=new ServerSocket(8888);
//等待要连接的客户端
while(true){
s=ss.accept();
connect=true;
Client c=new Client(s);
new Thread(c).start();
//把连接进来的客户端添加到容器ArrayList中
clients.add(c);
System.out.println("a client connected!");
}
}catch(Exception e){
e.printStackTrace();
}
finally{
try {
ss.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
//定义内部线程类
class Client implements Runnable{
Socket s=null;
DataInputStream dis=null;
DataOutputStream dos=null;
String str=null;
public Client(Socket s){
this.s=s;
try {
dis=new DataInputStream(s.getInputStream());
dos=new DataOutputStream(s.getOutputStream());
} catch (IOException e) {
e.printStackTrace();
}
}
public void sendMessage(){
try {
System.out.println(str+"!first");
dos.writeUTF(str);
} catch (IOException e) {
e.printStackTrace();
}
}
public void run() {
try{
//接受客户端发送过来的信息,并读取信息
while(connect){
str=dis.readUTF();
//把信息发送给各个客户端
for(int i=0;i<clients.size();i++){
//实例化各个客户端
Client c1=clients.get(i);
c1.sendMessage();
}
}
} catch (IOException e) {
System.out.println("error");
}finally{
try{
if(dis!=null) dis.close();
if(dos!=null) dos.close();
if(s!=null) s.close();
}catch(Exception e){
e.printStackTrace();
}
}
}
}
}
如:
public void run() {
try{
//接受客户端发送过来的信息,并读取信息
while(connect){
String str=dis.readUTF();
//把信息发送给各个客户端
for(int i=0;i<clients.size();i++){
//实例化各个客户端
Client c1=clients.get(i);
c1.sendMessage(str);
}
}
效果怎么样?
也就是说
for(int i=0;i<clients.size();i++){
//实例化各个客户端
Client c1=clients.get(i);
c1.sendMessage(str); //这里有传输先后的影响,具体LZ自己体会吧