佳礼资讯网

 找回密码
 注册

ADVERTISEMENT

查看: 1348|回复: 12

Java Client Server - Socket Programming [已解决]

[复制链接]
发表于 6-8-2009 08:07 PM | 显示全部楼层 |阅读模式
嗨,大家好,我要写个普通的client server program,
然后呢,Client需要send message给server,然后server自动的再依不同的 message 做不同的事情也给与Client回复。
初步阶段是,我要确保client 和 server 之间的communication是 client to server 一次, server to client 一次, 连惯性的。
以下是我的 client 和 server 的文件。
现阶段我做到的是 client can keep send message to server。

/*
** test_client.java
*/
import java.io.*;
import java.net.*;
import java.lang.*;

public class test_client
{
        public static void main(String args[]) throws Exception
        {
                DataInputStream input = new DataInputStream(System.in) ;

                System.out.print("Enter server address : " ) ;
                String str = input.readLine() ;
               
                Socket connection = new Socket( str, 4321 ) ;

                PrintWriter out = new PrintWriter(connection.getOutputStream(),true) ;
                BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream())) ;               
               
                BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)) ;
                System.out.println(connection.getInetAddress()) ;
                System.out.println(connection.getOutputStream()) ;
                System.out.println(connection.getInputStream()) ;
               
                String sendMsg;
                boolean firstWord;
                firstWord = true;

                while(connection.isConnected() == true)
                {
                // << PLACE A >>                        
                        if(firstWord == true)
                        {
                                sendMsg = in.readLine() ;//Statement 1
                                System.out.println(sendMsg) ;
                                firstWord = false ;
                        }
                        
                        System.out.print(">" ) ;
                        sendMsg = reader.readLine() ;
                        
                        out.println(sendMsg) ;
                        if(sendMsg.equals("EXIT" ))
                        {
                                System.out.println("SYSTEM EXIT" ) ;
                                connection.close() ;
                                System.exit(1) ;
                        }
                }
        }
}

/*
** test_server.java
*/

import java.io.*;
import java.net.*;
import java.lang.*;


public class test_server
{        
        public static void main(String args[]) throws Exception
        {                                
                ServerSocket serverSocket = new ServerSocket(4321) ;
               
                Socket connection = serverSocket.accept() ;
               
                PrintWriter out = new PrintWriter(connection.getOutputStream(),true) ;
                BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream())) ;                                
                BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)) ;
               
                System.out.println("Establish connection from " + connection.getLocalSocketAddress() + "\n waha"  ) ;
               
                String getMsg;
                boolean firstWord;
                firstWord = true;
               
                while(connection.isConnected() == true)
                {        
                        if(firstWord == true)
                        {
                        out.println("Welcom to Ublog Server !!!" ) ;
                        firstWord = false;
                        }
                        
                        getMsg = in.readLine();
            if(getMsg.isEmpty() == false && getMsg.equals("EXIT" ) == false)
            {
                    if(getMsg.equals("WAZA" ))
                    {
                            System.out.println("hey yo" ) ;
                            out.println("hey yo" ) ;
                    }
                    else
                    {
                            System.out.println("client_> " + getMsg) ;
                    }                    
                    
            }
            else
            {
                    System.out.println("haa" ) ;
            }

                        if(getMsg.equals("EXIT" ))
                        {
                                System.out.println("CLIENT REQUEST EXIT" );
                                connection.close() ;
                                System.exit(1) ;
                        }
                }
        }
}

问题来了,当我把statement 1 放在 place A 的时候,我的client side收到一次server 的 message 之后,只可以send 3 次 message给server然后就什么都做不到了。一直停留在那个place A。
在client send了两次message给server后,server回复一个message,client又可以在连send 3次message。然后也就什么都做不到了。
我只要server send one time message, client send one time message accordingly.
我相信是我的logic出了问题,可能还有其他的问题吧,请各位帮忙指正. 谢谢

[ 本帖最后由 nick_khor 于 8-8-2009 10:43 AM 编辑 ]
回复

使用道具 举报


ADVERTISEMENT

发表于 6-8-2009 10:45 PM | 显示全部楼层
原帖由 nick_khor 于 6-8-2009 08:07 PM 发表
嗨,大家好,我要写个普通的client server program,
然后呢,Client需要send message给server,然后server自动的再依不同的 message 做不同的事情也给与Client回复。
初步阶段是,我要确保client 和 server 之间的 ...


身为开发者,要知道documentation 是最重要的。它可以让未来的你或别人明白当时的设计概念及做出各种决定的原因。 你上面连命名都做不好,剩下的结构流程更不用说咯。

其实写程式的方法应该是先做好规划,推敲逻辑完整性,然后才把运作流程转换为代码。。language/syntax 在里面是不值钱的东西, 很多人都不懂,只会抱怨付出与结果不符(好像只用笔+计算器的会计师,多努力工作都比不上用excel的轻松完成工作又被赏识)

习惯是要养成的,对自己有利的更要刻意去培养


我没用过java, 但理解一下还可以
server 里没看到等待连接的部分,可能是 accept() 时候会等到连接后才return吧。
你的一次性的greeting code ("Welcom to...."为什么不放在外面?每个loop iteration都检查一遍真有效率, 而且还是用string呢。。简单一些的boolean不是更快更好嘛
除非 "EXIT " (有空格), 否则server每个loop iteration都会打印 "haa"
如果收到"WAZA", 就回复"hey yo"

如果你要弄成一人一句的交叉沟通,那么起码server没一次收到message都该回复一句吧。。

你自己的实验里没讲你发送了什么,收到什么, 我想我们该求你提供一下好让我们能帮你
回复

使用道具 举报

 楼主| 发表于 6-8-2009 10:57 PM | 显示全部楼层
原帖由 yeenfei 于 6-8-2009 10:45 PM 发表


身为开发者,要知道documentation 是最重要的。它可以让未来的你或别人明白当时的设计概念及做出各种决定的原因。 你上面连命名都做不好,剩下的结构流程更不用说咯。

其实写程式的方法应该是先做好规划,推 ...

哦。。 了解,这个是我的个人习惯,会改。 我还是个学生,这个也是我的课外题目来的。 hehe

至于那个Boolean的问题,我会改.
我的greeting code还有其他目的,而且我是要等 connection establish的时候才send,如果放在LOOP外面的话,connection还没有联接成就就已经send出去了,那client既不是收不到?
那些你们看到的空格是我另外空的,因为不这样的话,我的program会出现很多( )这个emotion.
那个EXIT和WAZA的回复完全没问题,问题就出在我之前所说的 "client send 3 次 message给server然后就什么都做不到了"
不过还是谢谢指点我的坏习惯

迟写我会纠正那些variable,和那些让人误看的 空位

[ 本帖最后由 nick_khor 于 6-8-2009 11:05 PM 编辑 ]
回复

使用道具 举报

发表于 7-8-2009 12:04 AM | 显示全部楼层
import java.* ;
import java.io.* ;
import java.net.* ;
import java.lang.* ;
import java.lang.String ;

回复

使用道具 举报

 楼主| 发表于 7-8-2009 12:30 AM | 显示全部楼层
原帖由 onlylonly 于 7-8-2009 12:04 AM 发表


我知道很多余
回复

使用道具 举报

 楼主| 发表于 7-8-2009 01:46 AM | 显示全部楼层
OK!

已经修改
回复

使用道具 举报

Follow Us
发表于 7-8-2009 12:05 PM | 显示全部楼层
仔细看你就会明白了。

//client
BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream())) ;     

你的 in 是读取 server side 的 message。

然而你看这里

//server
            if(getMsg.isEmpty() == false && getMsg.equals("EXIT" ) == false)
            {
                    if(getMsg.equals("WAZA" ))
                    {
                            System.out.println("hey yo" ) ;
                            out.println("hey yo" ) ; //server replied
                    }
                    else
                    {
                            System.out.println("client_> " + getMsg) ;
                             //lack of server reply
                    }                    
                    
            }

因此, 除非你在 client 那里移植输入 WAZA, 你才能够得到server reply, 不然的话, 你的 server 没有reply。 那么

//client
         while(connection.isConnected() == true)
                {
                // << PLACE A >>                        
                sendMsg = in.readLine() ; //Statement 1 // client keep waiting for server reply until time out
                        if(firstWord == true)
                        {
                              
                                System.out.println(sendMsg) ;
                                firstWord = false ;
                        }
                        
                        System.out.print(">" ) ;
                        sendMsg = reader.readLine() ;
                        
                        out.println(sendMsg) ;
                        if(sendMsg.equals("EXIT" ))
                        {
                                System.out.println("SYSTEM EXIT" ) ;
                                connection.close() ;
                                System.exit(1) ;
                        }
                }

你的 client 就会傻傻的在那里等, 一直到 connection timeout, 然后assign null 去 getMsg.
回复

使用道具 举报

 楼主| 发表于 7-8-2009 07:16 PM | 显示全部楼层
hm...我摸摸看再回复您
谢咯 onlylonly
回复

使用道具 举报


ADVERTISEMENT

发表于 7-8-2009 08:45 PM | 显示全部楼层

回复 7# onlylonly 的帖子

然后assign null 去 getMsg


抱歉写错了, 不是getMsg, 是 sendMsg
回复

使用道具 举报

发表于 7-8-2009 09:09 PM | 显示全部楼层
原帖由 nick_khor 于 6-8-2009 10:57 PM 发表
我的greeting code还有其他目的,而且我是要等 connection establish的时候才send,如果放在LOOP外面的话,connection还没有联接成就就已经send出去了,那client既不是收不到?


我所指的外面是在loop外,印证连接成功后的地方。可以是一个专门等待连接的loop呵。。
再说,我好像没发现你的代码里有 ‘等 connection establish" 的部分 (很明显的缺乏documentation)

头脑灵活一点,逻辑换成想下面那样,不是比较有效率吗?

  1. while not connected
  2.         Sleep

  3. Greet connected client

  4. messageloop until exit
复制代码
回复

使用道具 举报

 楼主| 发表于 7-8-2009 09:24 PM | 显示全部楼层
原帖由 yeenfei 于 7-8-2009 09:09 PM 发表


我所指的外面是在loop外,印证连接成功后的地方。可以是一个专门等待连接的loop呵。。
再说,我好像没发现你的代码里有 ‘等 connection establish" 的部分 (很明显的缺乏documentation)

头脑灵活一点, ...

哦哦~
的确缺乏comment
connection establish在 >> connection.isConnected() == true <<
before connection establish,会停留在 >> Socket connection = serverSocket.accept(); <<
回复

使用道具 举报

发表于 7-8-2009 10:17 PM | 显示全部楼层

回复 10# yeenfei 的帖子

java 里不必如此。 connection 等待无需用户烦恼, 无法连接时自然又 exception。 只要handle exception 就没问题了。

Connection.isConnected() 会自动将 connection handle 好。

但是nick , 你的 coding style 还得多多改进, 不说你的 naming style , 你的 algorithm 也必须改进

1. 将 code modulerize , i.e 分成多个method ( 也就是一般说的 function )
2. comment
3. 别让rudundent looping 浪费了 processor 资源

e.g

  while(connection.isConnected() == true)
                {        
                        if(firstWord == true)
                        {
                        out.println("Welcom to Ublog Server !!!" ) ;
                        firstWord = false;
                        }
                        
                        getMsg = in.readLine();
            if(getMsg.isEmpty() == false && getMsg.equals("EXIT" ) == false)
            {
                    if(getMsg.equals("WAZA" ))
                    {
                            System.out.println("hey yo" ) ;
                            out.println("hey yo" ) ;

换成

   if(connection.isConnected())
                        out.println("Welcom to Ublog Server !!!" ) ;


  while(connection.isConnected() == true)
                {        
                     
                        
                        getMsg = in.readLine();
            if(getMsg.isEmpty() == false && getMsg.equals("EXIT" ) == false)
            {
                    if(getMsg.equals("WAZA" ))
                    {
                            System.out.println("hey yo" ) ;
                            out.println("hey yo" ) ;

[ 本帖最后由 onlylonly 于 7-8-2009 10:19 PM 编辑 ]
回复

使用道具 举报

 楼主| 发表于 8-8-2009 10:42 AM | 显示全部楼层
原帖由 onlylonly 于 7-8-2009 10:17 PM 发表
java 里不必如此。 connection 等待无需用户烦恼, 无法连接时自然又 exception。 只要handle exception 就没问题了。

Connection.isConnected() 会自动将 connection handle 好。

但是nick , 你的 coding s ...

嘿嘿!! 明白了!!
脑筋转不过
谢谢

[ 本帖最后由 nick_khor 于 8-8-2009 10:44 AM 编辑 ]
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

 

ADVERTISEMENT



ADVERTISEMENT



ADVERTISEMENT

ADVERTISEMENT


版权所有 © 1996-2023 Cari Internet Sdn Bhd (483575-W)|IPSERVERONE 提供云主机|广告刊登|关于我们|私隐权|免控|投诉|联络|脸书|佳礼资讯网

GMT+8, 5-12-2025 11:40 PM , Processed in 0.151299 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表