Socket编程实例--一个Socket Server和Client端实现数据收发的例子

    最近对Socket有初次接触,对其比较感兴趣,参考网上的Socket编程实例,修改了部分内容后,写了一个Socket的Server端和Cliet端收发数据的小例子。

    该实例完成的功能如下:

    一次启动Server端和Client端后,首先由Server端发‘1’给Client端,Client端将接收到的数据加1后,发该数据给Server端,Server端再将数据加1后发给Client端,依次类推。直到Server端收到数据20,Client收到19时,两方中断收发。

    程序代码如下:

  1.    Socket Server

 

/**
 * Socket的Server举例
 * 
@author Amigo Xie(xiexingxing1121@126.com)
 * 
@since 2006/12/28
 
*/

public   class  SocketServer  {
    ServerSocket serverSocket 
= null;
    Socket socket 
= null;
    DataInputStream inStream 
= null;
    DataOutputStream outStream 
= null;
    
    
    
public static void main(String[] args) {
        SocketServer socketServer 
= new SocketServer();
        socketServer.waitForClient();
    }

    
    
public SocketServer() {
        
try {
            serverSocket 
= new ServerSocket(6600);
        }
 catch(Exception e) {
            e.printStackTrace();
        }

    }

    
    
void waitForClient() {
        
try {
            socket 
= serverSocket.accept();
            inStream 
= new DataInputStream(socket.getInputStream());
            outStream 
= new DataOutputStream(socket.getOutputStream());
            outStream.writeUTF(
"1");
            socket.setSoTimeout(
3000);
            acceptAndSendData();
        }
 catch(Exception e) {
            e.printStackTrace();
        }

    }


    
void acceptAndSendData(){
        
while(true{
            
try {
                String acceptStr 
= inStream.readUTF();
                System.out.println(
"Server accept:" + acceptStr);
                
int num = Integer.parseInt(acceptStr) + 1;
                
if(num > 20{
                    System.out.println(
"Send end!");
                    
break;
                }
 else {
                    String sendStr 
= Integer.toString(num);
                    outStream.writeUTF(sendStr);
                }

            }
 catch(Exception e) {
                e.printStackTrace();
                
break;
            }

        }

    }

}

 

     2. Socket Client端代码

  

/**
 * Socket的Client举例
 * 
@author Amigo Xie(xiexingxing1121@126.com)
 * 
@since 2006/12/28
 
*/

public   class  SocketCliet  {

    Socket socket 
= null;

    DataInputStream inStream 
= null;

    DataOutputStream outStream 
= null;

    
public static void main(String[] args) {
        SocketCliet socketCliet 
= new SocketCliet();
    }


    
public SocketCliet() {
        
try {
            init();
            waitData();
        }
 catch (Exception e) {
            e.printStackTrace();
        }

    }


    
void init() throws Exception {
        socket 
= new Socket("127.0.0.1"6600);
        inStream 
= new DataInputStream(socket.getInputStream());
        outStream 
= new DataOutputStream(socket.getOutputStream());
        socket.setSoTimeout(
3000);
    }

    
    
void waitData() {
        
boolean flag = true;
        
while (flag) {
            
try {
                String acceptStr 
= inStream.readUTF();
                System.out.println(
"Client accept: " + acceptStr);
                String sendStr 
= Integer.toString(Integer.parseInt(acceptStr) + 1);
                outStream.writeUTF(sendStr);
                
if(Integer.parseInt(sendStr) >= 20{
                    flag 
= false;
                }

            }
 catch (Exception e) {
                e.printStackTrace();
                
break;
            }

        }

    }

}

 

            在调试时,由于编码的失误,因为在Server端有超过20时跳出while的判断,而Client类中未加:

   if(Integer.parseInt(sendStr) >= 20) {
         flag = false;
    }

    来使程序跳出循环,程序报出了如下错误:java.net.SocketException: Connection reset。。。。。。

  引起该问题的原因是由于此时Server端连接已经被复位,而Client依然通过该连接在接收和发送数据,在网上搜索了一下该错误,发现该错误引起的原因大都是防火墙的原因,嘿嘿,又学了一招。

      过几天继续研究Socket通信编程,写了好的实用的例子继续帖上来 :)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值