第3章 TCP/IP Socket网络通讯------第4章 实现Socket C/S应用程序

使用Socket:

      需要指定IP地址和端口号。

     

      搭建服务器:

      1.声明ServerSocket(端口号);

      2.serversocket.accept();等待连接,如果连接成功,获取socket对象

      3.获取输出流----socket.getOutputStream()

      4.获取输入流----socket.getInputStream()

      5.使用流进行读写,关闭流,关闭socket

     

      搭建客户端:

      1.创建一个scoket并声明Ip和端口号

      2.获取输出流----socket.getOutputStream()

      3.获取输入流----socket.getInputStream()

      4.使用流进行读写,关闭流,关闭socket

     

       BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream(), "utf-8"));

       ----讲InputStream包装为一个BufferedReader,并且使用utf-8来作为编码集

     

       DataInputStream dis = new DataInputStream(    socket.getInputStream());----获取数据输入流

      String s = dis.readUTF();----使用utf-8来作为编码集

     

      ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());

      ois.readObject();   获取到一个Object类型的数据

     

      多线程的服务器:主线程只负责处理ServerSocket,只负责等待连接,一旦有客户端连接成功,启动一个子线程,

      所有的数据交互都是在子线程中完成的。

 

1 while(true){
2       Socket s = server.accept();
3       ThreadServie service = new ThreadService(s);
4       Thread t = new Thread(service);
5       t.start();
6 }

          

      应用程序请求网络的权限:

      <uses-permission android:name="android.permission.INTERNET" />

      ANR:ANR是Application Not Responding的缩写,即应用程序无响应

      CalledFormWrongThreadException:在错误的线程中调用了方法

      不允许在子线程中进行UI界面的更新。不允许在主线程中进行耗时操作和网络请求

 

           案例代码:

    package: com.gzy.server.utils

 1 public class CloseUtils {
 2     /**
 3      * 关闭Closeable对象
 4      * @param closeable
 5      */
 6     public static void closeQuietly(Closeable closeable) {
 7         if(null != closeable) {
 8             try {
 9                 closeable.close();
10             } catch (IOException e) {
11                 e.printStackTrace();
12             }
13         }        
14     }
15 }

    package: com.gzy.server

 1 /**
 2  * 负责与客户端连接
 3  * @author Administrator
 4  *
 5  */
 6 public class DownloadServer {
 7 
 8     public final static int PORT = 4321;    //指定端口号
 9     private ServerSocket mServerSocket;
10     private boolean loop = true;
11     
12     public DownloadServer() {
13         try {
14             mServerSocket = new ServerSocket(PORT);
15         } catch (IOException e) {
16             e.printStackTrace();
17         }
18         
19         while (loop) {
20             try {
21                 Socket mSocket = mServerSocket.accept();
22                 System.out.println("已接收客户端连接...");
23                 
24                 Thread mThread = new Thread(new SocketThread(mSocket));
25                 mThread.start();
26             } catch (IOException e) {
27                 e.printStackTrace();
28             } 
29         }    
30     }
31     
32     public void shutdown() {
33         loop = false;
34     }
35     
36     public static void main(String[] args) {
37         System.out.println("启动服务器...");
38         new DownloadServer();
39     }
40 }

 

    package: com.gzy.server

 1 /**
 2  * 负责多线程
 3  * @author Administrator
 4  *
 5  */
 6 public class SocketThread implements Runnable {
 7 
 8     private Socket socket;
 9     
10     public SocketThread(Socket socket) {
11         this.socket = socket;
12     }
13     
14     @Override
15     public void run() {
16         ObjectInputStream ois = null;
17         ObjectOutputStream oos = null;
18         
19         try {
20             ois = new ObjectInputStream(socket.getInputStream());
21             String cmd = ois.readUTF();
22             System.out.println("服务器接收命令:cmd=[" + cmd + "]" );
23             
24             oos = new ObjectOutputStream(socket.getOutputStream());
25             DownloadService mService = new DownloadService(cmd);
26             Object object = mService.doRequst();
27             oos.writeObject(object);
28             oos.flush();
29         } catch (IOException e) {
30             e.printStackTrace();
31         } finally {
32             CloseUtils.closeQuietly(oos);
33             CloseUtils.closeQuietly(ois);
34             CloseUtils.closeQuietly(socket);
35         }
36     }
37 }

 

    package: com.gzy.server

 1 /**
 2  * 负责对具体命令的处理工作
 3  * @author Administrator
 4  *
 5  */
 6 public class DownloadService {
 7     
 8     /**
 9      * cmd list:
10      * 1            -- retieve file list
11      * 2            -- retieve file after date
12      * 3filename    -- download file
13      */
14     private String cmd;
15     private static final String FILEPATH = "D:/Workspace";
16     
17     public DownloadService(String cmd) {
18         this.cmd = cmd;
19     }
20 
21     public Object doRequst() {
22         char cmdChar = cmd.charAt(0);
23         Object object = null;
24         
25         switch(cmdChar) {
26             case '1':
27                 //获取文件名列表
28                 object = getFileList();
29                 break;
30             case '2':
31                 //TODO
32                 break;
33             case '3':
34                 //TODO
35                 break;
36         }
37         return object;
38     }
39 
40     /**
41      * 获取所有文件名列表
42      * @return
43      */
44     private String[] getFileList() {
45         File file = new File(FILEPATH);
46         String[] list = file.list();
47         return list;
48     }
49 }

 

    com.gzy.server.testclient

 1 public class Client {
 2     private static final String POST = "127.0.0.1";
 3     
 4     public static void main(String[] args) {
 5         Socket socket = null;
 6         ObjectOutputStream oos = null;
 7         ObjectInputStream ois = null;
 8         
 9         try {
10             socket = new Socket(POST, DownloadServer.PORT);
11             oos = new ObjectOutputStream(socket.getOutputStream());
12             oos.writeUTF("1");
13             oos.flush();
14             
15             ois = new ObjectInputStream(socket.getInputStream());
16             String[] list = (String[])ois.readObject();//获取文件列表
17             System.out.println("接收文件目录: ");
18             for (String str : list) {
19                 System.out.println("[" + str + "]");
20             }
21         } catch (Exception e) {
22             e.printStackTrace();
23         } finally {
24             CloseUtils.closeQuietly(socket);
25             CloseUtils.closeQuietly(oos);
26             CloseUtils.closeQuietly(ois);
27         }
28     }
29 }

 

转载于:https://www.cnblogs.com/starman/p/5061615.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
本例子就是Delphi中如何利用Socket编写通信程序。 计算机网络是由一系列网络通信协议组成的,其中的核心协议是传输层的TCP/IP和UDP协议。TCP是面向连接的,通信双方保持一条通路,好比目前的电话线,使用telnet登陆BBS,用的就是TCP协议;UDP是无连接的,通信双方都不保持对方的状态,浏览器访问Internet时使用的HTTP协议就是基于UDP协议的。TCP和UDP协议都非常复杂,尤其是TCP协议,为了保证网络传输的正确性和有效性,必须进行一系列复杂的纠错和排序等处理。   Socket是建立在传输层协议(主要是TCP和UDP)上的一种套接字规范,最初是由美国加州Berkley大学提出,它定义两台计算机间进行通信的规范(也是一种编程规范),如果说两台计算机是利用一个“通道“进行通信,那么这个“通道“的两端就是两个套接字。套接字屏蔽了底层通信软件和具体操作系统的差异,使得任何两台安装了TCP协议软件和实现了套接字规范的计算机之间的通信成为可能。   微软的Windows Socket规范(简称winsock)对Berkley的套接字规范进行了扩展,利用标准的Socket的方法,可以同任何平台上的Socket进行通信;利用其扩展,可以更有效地实现在Windows平台上计算机间的通信。在Delphi中,其底层的Socket也应该是Windows的SocketSocket减轻了编写计算机间通信软件的难度,但总的说来还是相当复杂的(这一点在后面具体会讲到);Inprise在Delphi中对Windows Socket进行了有效的封装,使得用户可以很方便地编写网络通信程序。 本例子就是Delphi中如何利用Socket编写通信程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值