java编程_socket_套接字_网络编程 (一)

2014-11-24 07:51:05 · 作者: · 浏览: 1
实现原理:
============================================================ 
服务器,使用ServerSocket监听指定的端口,端口可以随意指定(由于1024以下的端口通常属于保留端口,
在一些操作系统中不可以随意使用,所以建议使用大于1024的端口),
等待客户连接请求,客户连接后,会话产生;在完成会话后,关闭连接。  
============================================================ 
客户端,使用Socket对网络上某一个服务器的某一个端口发出连接请求,一旦连接成功,打开会话;会话完成后,
关闭Socket。客户端不需要指定打开的端口,通常临时的、动态的分配一个1024以上的端口。
============================================================ 
服务器端代码:

1 package com.b510.socket1703;
2
3 import java.io.*;
4 import java.net.Socket;
5 import java.net.ServerSocket;
6
7 /**
8 * 服务器断的工作就是在指定的端口上监听
9 *
  • 建立连接

  • 10 *
  • 打开输出流

  • 11 *
  • 封装输出流

  • 12 *
  • 向客户端发送数据

  • 13 *
  • 关闭打开的输出流

  • 14 *
  • 关闭打开的socket对象

  • 15 *
    16 * @author Hongten
    17 *
    18 * @time 2012-4-29 2012
    19 */
    20 public class TestServer {
    21 public static void main(String args[]) {
    22 try {
    23 // 指定服务器端的端口号为8888
    24 ServerSocket s = new ServerSocket(8888);
    25 while (true) {
    26 // 建立连接
    27 Socket socket = s.accept();
    28 // 打开输出流
    29 OutputStream os = socket.getOutputStream();
    30 // 封装输出流
    31 DataOutputStream dos = new DataOutputStream(os);
    32 // s
  • .getInetAddress()获取远程ip地址,s
  • .getPort()远程客户端的断后好
    33 // 向客户端发送数据
    34 dos.writeUTF("你好,客户端地址信息: " + socket.getInetAddress()
    35 + "\t客户端通信端口号: " + socket.getPort());
    36 dos.writeUTF("i'm a server ,my name is hongten!");
    37 // 关闭打开的输出流
    38 dos.close();
    39 // 关闭打开的socket对象
    40 socket.close();
    41 }// 开始下一此循环
    42 } catch (IOException e) {
    43 e.printStackTrace();
    44 }
    45 }
    46 }

    客户端代码:

    1 package com.b510.socket1703;
    2
    3 import java.io.*;
    4 import java.net.Socket;
    5
    6 /**
    7 * 客户端
    8 * @author Hongten
    9 *
    10 * @time 2012-4-29 2012
    11 */
    12 public class TestClient {
    13 public static void main(String args[]) {
    14 try {
    15 // 创建socket对象,指定服务器的ip地址,和服务器监听的端口号
    16 // 客户端在new的时候,就发出了连接请求,服务器端就会进行处理,如果服务器端没有开启服务,那么
    17 // 这时候就会找不到服务器,并同时抛出异常==》java.net.ConnectException: Connection
    18 // refused: connect
    19 Socket s1 = new Socket("127.0.0.1", 8888);
    20 // 打开输入流
    21 InputStream is = s1.getInputStream();
    22 // 封装输入流
    23 DataInputStream dis = new DataInputStream(is);
    24 // 打印服务器端发送过来的信息
    25 System.out.println(dis.readUTF());
    26 System.out.println(dis.readUTF());
    27 // 关闭输入流
    28 dis.close();
    29 // 关闭打开的socket对象
    30 s1.close();
    31 } catch (IOException e) {
    32 e.printStackTrace();
    33 }
    34 }
    35 }

    如果服务器端没有打开,这时候运行客户端,出现的结果:

    1 java.net.ConnectException: Connection refused: connect
    2 at java.net.PlainSocketImpl.socketConnect(Native Method)
    3 at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:333)
    4 at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:195)
    5 at java.net.PlainSocketImpl.connect(PlainSocketImpl.java