Java网络编程之tcp的socket通信

1、客户端MyClient.java

 1 import java.io.*;
 2 import java.net.*;
 3
 4 public class MyClient
 5 {
 6     public static void main(String[] args)throws Exception
 7     {
 8         Socket s = new Socket("192.168.1.1" , 30000);
 9         // 客户端启动ClientThread线程不断读取来自服务器的数据
10         new Thread(new ClientThread(s)).start();11         // 获取该Socket对应的输出流
12         PrintStream ps = new PrintStream(s.getOutputStream());
13         String line = null;
14         // 不断读取键盘输入
15         BufferedReader br = new BufferedReader(
16             new InputStreamReader(System.in));
17         while ((line = br.readLine()) != null)
18         {
19             // 将用户的键盘输入内容写入Socket对应的输出流
20             ps.println(line);
21         }
22     }
23 }

2、加入多线程,ClientThread.java

 1 import java.io.*;
 2 import java.net.*;
 3
 4 public class ClientThread implements Runnable
 5 {
 6     // 该线程负责处理的Socket
 7     private Socket s;
 8     // 该线程所处理的Socket所对应的输入流
 9     BufferedReader br = null;
10     public ClientThread(Socket s)
11         throws IOException
12     {
13         this.s = s;
14         br = new BufferedReader(
15             new InputStreamReader(s.getInputStream()));
16     }
17     public void run()
18     {
19         try
20         {
21             String content = null;
22             // 不断读取Socket输入流中的内容,并将这些内容打印输出
23             while ((content = br.readLine()) != null)
24             {
25                 System.out.println(content);
26             }
27         }
28         catch (Exception e)
29         {
30             e.printStackTrace();
31         }
32     }
33 }

3、服务器端MyServer.java

 1 import java.net.*;
 2 import java.io.*;
 3 import java.util.*;
 4
 5 public class MyServer
 6 {
 7     // 定义保存所有Socket的ArrayList
 8     public static ArrayList<Socket> socketList
 9         = new ArrayList<Socket>();
10     public static void main(String[] args)
11         throws IOException
12     {
13 System.out.println("222222……");
14         ServerSocket ss = new ServerSocket
15
16 (30000);
17         while(true)
18         {
19 System.out.println("服务器等待链接……");
20             // 此行代码会阻塞,将一直等待别人的连接
21             Socket s = ss.accept();
22             socketList.add(s);
23             // 每当客户端连接后启动一条ServerThread线程为该客户端服务
24             new Thread(new ServerThread
25
26 (s)).start();
27         }
28     }
29 }

4、为服务器端通信加入多线程

 1 import java.io.*;
 2 import java.net.*;
 3 import java.util.*;
 4
 5 // 负责处理每个线程通信的线程类
 6 public class ServerThread implements Runnable {
 7     // 定义当前线程所处理的Socket
 8     Socket s = null;
 9     // 该线程所处理的Socket所对应的输入流
10     BufferedReader br = null;
11
12     public ServerThread(Socket s) throws IOException {
13         System.out.println("4444444……");
14         this.s = s;
15         // 初始化该Socket对应的输入流
16     String ip=s.getInetAddress().getHostAddress();
17         System.out.println("ip地址为"+ip+"........connected!!!");
18         br = new BufferedReader(new InputStreamReader(s.getInputStream(),
19                 "utf-8")); //
20     }
21
22     public void run() {
23         System.out.println("555555……");
24         try {
25             System.out.println("4444444……");
26             String content = null;
27             // 采用循环不断从Socket中读取客户端发送过来的数据
28             while ((content = readFromClient()) != null) {
29                 /*System.out.println("---"
30                         + Arrays.toString(content.getBytes("utf-8")));*/
31                 System.out.println("---" +"客户端发来的数据为"+content);
32                 System.out.println("===============");
33                 // 遍历socketList中的每个Socket,
34                 // 将读到的内容向每个Socket发送一次
35                 for (Iterator<Socket> it = MyServer.socketList.iterator(); it
36                         .hasNext();) {
37                     Socket s = it.next();
38                     try {
39                         System.out.println("666666");
40                         OutputStream os = s.getOutputStream();
41                         os.write((content+"服务器反馈给客户端ok" + "\n").getBytes("utf-8"));
42                         System.out.println("777777");
43                     } catch (SocketException e) {
44                         e.printStackTrace();
45                         // 删除该Socket。
46                         it.remove();
47                         System.out.println(MyServer.socketList);
48                     }
49                 }
50             }
51         } catch (IOException e) {
52             e.printStackTrace();
53         }
54     }
55
56     // 定义读取客户端数据的方法
57     private String readFromClient() {
58         try {
59             return br.readLine();
60         }
61         // 如果捕捉到异常,表明该Socket对应的客户端已经关闭
62         catch (IOException e) {
63             e.printStackTrace();
64             System.out.println("客户端已经关闭!!!");
65             // 删除该Socket。
66             MyServer.socketList.remove(s);
67         }
68         return null;
69     }
70 }
时间: 2024-10-18 23:50:59

Java网络编程之tcp的socket通信的相关文章

java网络编程之TCP实例

Dgram类 package Socket; import java.net.DatagramPacket; import java.net.InetAddress; public class Dgram { public static DatagramPacket toDatagram(String s, InetAddress destIA, int destPort) { byte[] buf = new byte[s.length() + 1]; s.getBytes(0, s.leng

Java网络编程之TCP通信

一.概述 Socket类是Java运行clientTCP操作的基础类,这个类本身使用代码通过主机操作系统的本地TCP栈进行通信. Socket类的方法会建立和销毁连接,设置各种Socket选项. ServerSocket类是Java执行server端操作的基础类,该类执行于server,监听入站TCP连接.每一个socketserver监听server的某个port.当远程主机的client尝试连接此port时.server就被唤醒.并返回一个表示两台主机之间socket的正常Socket对象.

Java网络编程之TCP、UDP

Java网络编程提供了两种协议:TCP(传输控制协议)和UDP(数据报协议).TCP(Transmission Control Protocol)是一种可靠的传输协议,传输时会采用"三次握手"端的方式建立连接,以保证数据的可靠性和安全性:而UDP(User Datagram Protocol)协议是一种不可靠的传输协议,发送的数据不一定能够接受的到,网上的聊天是工具一般采用的此协议.下面将详细的接受TCP和UDP的使用以及相应的编码. 一.TCP网络通信 Java中使用Socket(套

[学习笔记]Java网络编程之TCP通讯

1. Socket类 1.1 概述 用于创建客户端套接字,以此建立TCP链接. 1.2 构造器 Socket() Socket(InetAddress address, int port) Socket(String host, int port) Socket(InetAddress address, int port, InetAddress localAddr, int localPort) Socket(String host, int port, InetAddress localAd

Java网络编程之TCP程序设计

在Java中使用Socket(套接字)来完成TCP程序的开发,使用此类可以方便的建立可靠的.双向的.持续的.点对点的通信连接.服务器端使用ServerSocket等待客户端的连接,,而每一个客户端都是用一个Socket对象表示. 1.ServerSocket类与Socket类 ServerSocket类主要运用在服务器端开发,用于接收客户端的连接请求.常用方法: 类型 方法 描述 构造方法 ServerSocket(int port) 创建绑定到特定端口的服务器套接字. Socket accep

Java网络编程之TCP网络编程

一.基于Socket的TCP编程 Java语言的基于套接字编程分为服务端编程和客户端编程,其通信模型如图所示: 二.客户端Socket的工作过程(四个基本步骤) 1.创建Socket根据指定服务端的IP地址或端口号构造Socket类对象.若服务器端响应,则建立客户端到服务器的通信线路:若连接失败,会出现异常.2.打开连接到Socket的输入出流使用getlnputStream()方法获得输入流,使用getOutputStream()方法获得输出流,进行数据传输.3.按照一定的协议对Socket

4.Java网络编程之TCP/UDP

常见传输协议: UDP , TCP UDP协议:    特点:         1.将数据及源和目的封装成数据包中,不需要建立连接         2.每个数据包的大小限制在64K内         3.因无连接,是不可靠协议         4.不需要建立连接,速度快 举例:比如你向家里邮寄一个包裹,无论家里此时是否有人,都会发送.当快递员发送到你家时,如果有人,家里人就收到了包裹,如果家里此时没有人,包裹(数据包)就被丢弃了. 自我理解: 当我们建立连接后,你说了一句:"你吃过饭了么?&qu

Java网络编程之Socket通信(二)

之前在前面已经介绍了Socket通信的一些基本原理,以及如何让客户端与服务器端建立通信,和实现通信的一些基本步骤(包括首先使得服务器端与客户端建立连接,建立连接之后,服务器端开始侦听客户端的请求,侦听到客户端的请求之后,通过输入输出流处理相关信息实现通信,最后通信完毕结束通信等一系列流程). 但是之前只是单个客户端与服务器进行通信,而我们实际应用中单个客户端的情况几乎不存在,都是多个客户端同时与服务器进行交互(这里同时交互就会出现并发性的问题,对于并发性的问题暂时还不是很懂,只知道有这个概念),

【转】JAVA网络编程之Socket用法

JAVA网络编程之Socket用法 分类: JAVA2012-08-24 15:56 710人阅读 评论(0) 收藏 举报 在客户/服务器通信模式中,客户端需要主动建立与服务器连接的Socket,服务器端收到客户端的连接请求,也会创建与客户端连接的Socket.Socket可以看做是通信连接两端的收发器,客户端和服务店都通过Socket来收发数据. 1.构造Socket public Socket() 通过系统默认类型的 SocketImpl 创建未连接套接字 public Socket(Str