lzzzing学习笔记

正在学的和想要学的

   :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  44 随笔 :: 7 文章 :: 17 评论 :: 0 Trackbacks
首先,进行服务端的编程,作为服务端,编程主要按下面几个步骤进行:

    // 1. 创建socket
    ServerSocket ss = new ServerSocket(PortNumber);
    Socket s = ss.accept(); //监听器,产生阻塞,直到有连接才停止阻塞。

    // 2. 打开输入流、输出流
    OutputStream os = s.getOutputStream();
    BufferedOutputStream bos = new BufferedOutputStream(os);
    InputStream is = s.getInputStream();

    // 3. 根据一定的协议读写数据
    // 服务器 --> 客户
    //os.write("Hello,I am Server!".getBytes());
    bos.write("Hello,I am Server!".getBytes());
    bos.flush(); //注意!!

    // 服务器 <-- 客户
    byte[] buf = new byte[100];
    int len = is.read(buf);
    System.out.println(new String(buf, 0, len));

    // 4. 关系流和Socket
    //os.close();
    bos.close();
    is.close();
    s.close();
    ss.close();

    作为客户端则分为下面几个步骤,其实和服务端差不多,只是少了用ServerSocket进行监听。

    // 1. 创建socket
    Socket s = new Socket(InetAddress.getByName("localhost"),
            PortNumber);
    // 2. 打开输入流、输出流
    OutputStream os = s.getOutputStream();
    InputStream is = s.getInputStream();

    // 3. 根据一定的协议读写数据
    // 服务器 --> 客户
    byte[] buf = new byte[100];
    int len = is.read(buf);
    System.out.println(new String(buf, 0, len));
    // 服务器 <-- 客户
    os.write("Hello,I am Client!".getBytes());

    // 4. 关系流和Socket
    os.close();
    is.close();
    s.close();

    上面这些只是一个单线程的服务端->客户端的程序,只能进行一次通讯,多次通讯将被告知无法连接。

    这时,我们就需要用到进程Thread进行编程,将其改造成多线程聊天程序,可以同时进行多客户端的连接与发送信息。

    代码如下:

 

  1    //Server.java
  2
  3    import java.awt.*;
  4    import java.net.*;
  5    import java.io.*;
  6
  7    public class Server extends Thread {
  8        ServerSocket skt;
  9
 10        Socket Client[]=new Socket[10];;
 11        Socket Client1=null;
 12
 13        int i = 0;
 14
 15        TextArea in;
 16
 17        int port,k=0,l=0;
 18
 19        //BufferedReader theInputStream;
 20
 21        PrintStream theOutputStream;
 22
 23        //String readin;
 24
 25        Face chat;
 26
 27        public Server(int port, Face chat) {
 28            try {
 29                this.port = port;
 30                skt = new ServerSocket(port);
 31                this.chat = chat;
 32            }
 catch (IOException e) {
 33                chat.ta.append(e.toString());
 34            }

 35        }

 36
 37        public void run() {
 38
 39            chat.ta.append("等待连线");
 40
 41            while (true{
 42                //System.out.print(""+i+"\n");
 43                try {
 44
 45
 46                Client[k] = skt.accept(); /* 接收客户连接 */
 47
 48                //当有客户端连接时就新建一个子线程
 49
 50
 51                if (i < 2{
 52                    ServerThread server[] = new ServerThread[10];
 53                     server[k]= new ServerThread(Client[k], this.chat, i);
 54                     l=server.length;
 55                     server[k].start();
 56                    chat.ta.append("客户端" + Client[k].getInetAddress() + "已连线\n");
 57                    /*theInputStream = new BufferedReader(new InputStreamReader(Client
 58                            .getInputStream()));*/

 59                    //for(int j=0;j<server.length;j++)
 60                    theOutputStream = new PrintStream(server[k].getClient().getOutputStream());
 61                    i = server[k].getI();
 62                    k++;
 63                }
 else {
 64                    //theOutputStream = new PrintStream(null);
 65                }

 66
 67            }
 catch (SocketException e) {
 68                //chat.ta.append("连线中断!\n");
 69
 70                //chat.clientBtn.setEnabled(true);
 71                //chat.serverBtn.setEnabled(true);
 72                //chat.tfaddress.setEnabled(true);
 73                //chat.tfport.setEnabled(true);
 74                //try {
 75
 76                        //skt.close();
 77                        //Client.close();
 78                    //} catch (IOException err) {
 79                    //    chat.ta.append(err.toString());
 80                    //}
 81                }
 catch (IOException e) {
 82                    chat.ta.append(e.toString());
 83                }

 84            }

 85
 86        }

 87
 88        public void dataout(String data) {
 89            //for(int j=0;j<l;j++)
 90            theOutputStream.println(data);
 91        }

 92    }

 93
 94    class ServerThread extends Thread {
 95        ServerSocket skt;
 96
 97        Socket Client;
 98
 99        TextArea in;
100
101        int port;
102
103        int i;
104
105        BufferedReader theInputStream;
106
107        PrintStream theOutputStream;
108
109        String readin;
110
111        Face chat;
112
113//服务端子线程 
114
115        public ServerThread(Socket s, Face chat, int i) {
116            this.i = ++i;
117            Client = s;
118            //this.port = port;
119            //skt = new ServerSocket(port);
120            this.chat = chat;
121
122        }

123
124        public int getI() {
125            return this.i;
126        }

127        public Socket getClient() {
128            return this.Client;
129        }

130        public void run() {
131
132            //chat.ta.append("等待连线");
133
134            try {
135                //Client = skt.accept(); /* 接收客户连接 */
136
137                //chat.ta.append("客户端" + Client.getInetAddress() + "已连线\n");
138                theInputStream = new BufferedReader(new InputStreamReader(Client
139                        .getInputStream()));
140                theOutputStream = new PrintStream(Client.getOutputStream());
141
142                while (true{
143                    readin = theInputStream.readLine();
144                    chat.ta.append(readin + "\n");
145                }

146
147            }
 catch (SocketException e) {
148                chat.ta.append("连线中断!\n");
149
150                chat.clientBtn.setEnabled(true);
151                chat.serverBtn.setEnabled(true);
152                chat.tfaddress.setEnabled(true);
153                chat.tfport.setEnabled(true);
154                try {
155                    i--;
156                    skt.close();
157                    Client.close();
158                }
 catch (IOException err) {
159                    chat.ta.append(err.toString());
160                }

161            }
 catch (IOException e) {
162                chat.ta.append(e.toString());
163            }

164        }

165
166        public void dataout(String data) {
167            theOutputStream.println(data);
168        }

169    }

170
171    //Client.java
172
173    import java.net.*;
174    import java.io.*;
175    import javax.swing.Timer;
176    class Client extends Thread {
177        Socket skt;
178        InetAddress host;
179        int port;
180
181        BufferedReader theInputStream;
182        PrintStream theOutputStream;
183        String readin;
184
185        Face chat;
186
187        public Client(String ip, int p, Face chat) {
188            try {
189                host = InetAddress.getByName(ip);
190                port = p;
191                this.chat = chat;
192            }
 catch (IOException e) {
193                chat.ta.append(e.toString());
194            }

195        }

196
197        public void run() {
198            try {
199                chat.ta.append("尝试连线");
200
201                skt = new Socket(host, port);
202                chat.ta.append("连线成功\n");
203
204                theInputStream = new BufferedReader(new InputStreamReader(skt
205                        .getInputStream()));
206
207                theOutputStream = new PrintStream(skt.getOutputStream());
208                //Timer myTimer = new Timer();
209                while (true{
210                    readin = theInputStream.readLine();
211                    chat.ta.append(readin + "\n");
212                }

213            }
 catch (SocketException e) {
214                chat.ta.append("连线中断!\n");
215                chat.clientBtn.setEnabled(true);
216                chat.serverBtn.setEnabled(true);
217                chat.tfaddress.setEnabled(true);
218                chat.tfport.setEnabled(true);
219                try {
220                    skt.close();
221                }
 catch (IOException err) {
222                    chat.ta.append(err.toString());
223                }

224            }
 catch (IOException e) {
225     &nbs