黑马程序员技术交流社区

标题: 网络和多线程的问题 [打印本页]

作者: 杜鹏云    时间: 2012-8-18 15:22
标题: 网络和多线程的问题
有如下代码文件:

import java.io.*;
import java.net.*;
public class Text9 {

       
        public static void main(String[] args) {
                //开启两个线程来模拟TCP客户端和服务器端
                new Thread(new TcpService()).start();
                new Thread(new TcpClient()).start();
               

        }

}

public class TcpService implements Runnable {
    //服务器端
        PrintWriter pw=null;
        BufferedReader br=null;
        ServerSocket ss=null;
        Socket s=null;
       
        @Override
        public void run() {
               
               
               
                try{
                        ss=new ServerSocket(8001);
                        s=ss.accept();
                        //读取客户端的字节流转换为缓冲字符流
                br=new BufferedReader(new InputStreamReader(s.getInputStream()));
                        /*将客户端的数据写入服务器端*/
                    pw=new PrintWriter(new FileWriter("upload.txt"),true);
                        String line=null;
                        while((line=br.readLine())!=null)
                        {
                                pw.println(line);
                        }
               PrintWriter bw=new PrintWriter(s.getOutputStream(),true);
                   bw.println("上传成功");

                             
                   }
                catch(Exception e)
                {
                        e.printStackTrace();
                }
                finally
                {     
                           pw.close();
                           try
                           {
                                   br.close();
                                   ss.close();
                           }
                           catch(Exception e)
                           {
                                   e.printStackTrace();
                           }
                          
                }
               
        }

}
public class TcpClient implements Runnable {
    //客户端
        Socket s=null;
        BufferedReader br=null;
        PrintWriter pw=null;
       
       
        public void run()
        {
                 try
                 {
                         s=new Socket("127.0.0.1",10003);
                          /*读取上传文件*/
                            br=new BufferedReader(new FileReader("..//exam//src//com//itheima//exercise.txt"));

                           /*将上传文件写入网络流*/
                           pw=new PrintWriter(s.getOutputStream(),true);
                           String line=null;
                           while((line=br.readLine())!=null)
                                {
                                   pw.println(line);
                                }
                                s.shutdownOutput();//返回传输结束标记

                    /*读取服务器端的反馈信息*/
                                BufferedReader bfrd=new BufferedReader(new InputStreamReader(s.getInputStream()));
                                String str=bfrd.readLine();
                                System.out.println(str);
                 }catch(Exception e)
                 {
                                e.printStackTrace();
                 }
                 finally
                 {
                           try
                           {
                                   br.close();
                                   s.close();       
                           }
                           catch(Exception e)
                           {
                                   e.printStackTrace();
                           }
                                 
                 }
                 
                       
        }
          

       
}


但程序结果是出现这样的异常:
java.net.BindException: Address already in use: JVM_Bind
        at java.net.PlainSocketImpl.socketBind(Native Method)
        at java.net.PlainSocketImpl.bind(PlainSocketImpl.java:359)
        at java.net.ServerSocket.bind(ServerSocket.java:319)
        at java.net.ServerSocket.<init>(ServerSocket.java:185)
        at java.net.ServerSocket.<init>(ServerSocket.java:97)
        at com.itheima.TcpService.run(TcpService.java:18)
        at java.lang.Thread.run(Thread.java:619)
Exception in thread "Thread-0" java.lang.NullPointerException
        at com.itheima.TcpService.run(TcpService.java:40)
        at java.lang.Thread.run(Thread.java:619)
java.net.ConnectException: Connection refused: connect
        at java.net.PlainSocketImpl.socketConnect(Native Method)
        at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:333)
        at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:195)
        at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:182)
        at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:366)
        at java.net.Socket.connect(Socket.java:519)
        at java.net.Socket.connect(Socket.java:469)
        at java.net.Socket.<init>(Socket.java:366)
        at java.net.Socket.<init>(Socket.java:180)
        at com.itheima.TcpClient.run(TcpClient.java:15)
        at java.lang.Thread.run(Thread.java:619)
java.lang.NullPointerException
        at com.itheima.TcpClient.run(TcpClient.java:40)
        at java.lang.Thread.run(Thread.java:619)
这个异常怎么解决?????????????????


作者: 杜佳瑞    时间: 2012-8-18 15:36
TCP是面向连接的协议。意思就是服务端必须先运行才能监听客户端的连接请求。
而你这里使用多线程有可能没建立连接,客户端就进行通信了,当然会发生异常了。
作者: 刘芮铭    时间: 2012-8-18 15:57
UDP是面向无连接的,就是不管建立连接与否,都可以进行通信等。
TCP是面向连接的,必须在建立连接的情况下,方能进行通信。
这里的异常我认为出现在没有建立连接。
作者: 徐小骥    时间: 2012-8-18 18:23
服务端中你的 ss=new ServerSocket(8001);指定侦听端口号为8001的请求
客户端中你的 s=new Socket("127.0.0.1",10003);指定的端口号为10003端口发送请求




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2