JAVA Socket编程(二)之TCP通信

简介: 基于TCP(面向连接)的socket编程,分为客户端和服务器端。 客户端的流程如下: (1)创建套接字(socket) (2)向服务器发出连接请求(connect) (3)和服务器端进行通信(send/recv) (4)关闭套接字 服务器端的流程如下: (1)创建套接字(socket)...

基于TCP(面向连接)的socket编程,分为客户端和服务器端。

客户端的流程如下:

(1)创建套接字(socket)

(2)向服务器发出连接请求(connect)

(3)和服务器端进行通信(send/recv)

(4)关闭套接字

服务器端的流程如下:

(1)创建套接字(socket)

(2)将套接字绑定到一个本地地址和端口上(bind)

(3)将套接字设为监听模式,准备接收客户端请求(listen)

(4)等待客户请求到来;当请求到来后,接受连接请求,返回一个新的对应于此次连接的套接字(accept)

(5)用返回的套接字和客户端进行通信(send/recv)

(6)返回,等待另一个客户请求。

(7)关闭套接字。

 

本文介绍一个多线程的TCP编程

1:创建服务器端并实现线程类  代码如下

 

 1 package tcp;
 2 
 3 import java.io.BufferedReader;
 4 import java.io.InputStreamReader;
 5 import java.io.PrintWriter;
 6 import java.net.Socket;
 7 
 8 public class Server implements Runnable {//实现一个线程类
 9 private Socket soc;
10     public Server(Socket soc) {
11     super();
12     this.soc = soc;
13 }
14     private BufferedReader in=null;
15     private BufferedReader input=null;//获得各种流对象
16     PrintWriter out=null;
17     @Override
18     public void run() {
19         // TODO Auto-generated method stub
20         try {
21             in=new BufferedReader(new InputStreamReader(soc.getInputStream()));
22             input=new BufferedReader(new InputStreamReader(System.in));
23             out=new PrintWriter(soc.getOutputStream(),true);//每次都清空输出流
24             String message;
25             while((message=in.readLine())!=null){
26                 System.out.println(message);//读取到的客户端数据
27                 System.out.println("输入回执的数据:");
28                 out.println(input.readLine());//回执数据
29             }
30         } catch (Exception e) {
31             // TODO: handle exception
32             e.printStackTrace();
33         }finally{
34             try {
35                 in.close();
36                 input.close();//关闭各种流对象
37                 out.close();
38             } catch (Exception e2) {
39                 e2.printStackTrace();
40                 // TODO: handle exception
41             }
42         }
43     }
44 
45 }

 

2:创建多线程的启动类   代码如下

 1 package tcp;
 2 
 3 import java.net.ServerSocket;
 4 import java.net.Socket;
 5 
 6 public class ServerStart {
 7 
 8     public static void main(String[] args) {
 9         // TODO Auto-generated method stub
10         try {
11             ServerSocket server=new ServerSocket(9000);//这只9000为服务器段
12             Socket soc=new Socket();
13             while (true) {
14                 soc=server.accept();//监听端口的链接
15                 new Thread(new Server(soc)).start();//只要有链接就启动一个线程
16             }
17         } catch (Exception e) {
18             // TODO: handle exception
19             e.printStackTrace();
20         }
21     }
22 
23 }

3:创建客户端的类  代码如下

 1 package tcp;
 2 
 3 import java.io.BufferedReader;
 4 import java.io.InputStreamReader;
 5 import java.io.PrintWriter;
 6 import java.net.Socket;
 7 
 8 public class Client {
 9     private static Socket soc=null;
10     private static BufferedReader in=null;
11     private static BufferedReader input=null;
12     private static PrintWriter out=null;
13     
14     public static void main(String[] args) {
15         // TODO Auto-generated method stub
16         try {
17             soc=new Socket("127.0.0.1",9000);
18             while(true){
19             in=new BufferedReader(new InputStreamReader(soc.getInputStream()));
20             input=new BufferedReader(new InputStreamReader(System.in));
21             out=new PrintWriter(soc.getOutputStream(),true);
22             System.out.println("输入发送的数据:");
23             String op=input.readLine();
24             out.println(op);
25             if(op.equals("aa")){
26                 break;
27             }
28                 System.out.println(in.readLine());
29             }
30         } catch (Exception e) {
31             // TODO: handle exception
32             e.printStackTrace();
33         }finally{
34             try {
35                 in.close();
36                 input.close();
37                 out.close();
38             } catch (Exception e2) {
39                 // TODO: handle exception
40                 e2.printStackTrace();
41             }
42         }
43     }
44 
45 }

 udp查看:http://www.cnblogs.com/GH0522/p/8119289.html

欢迎大家一起说出自己的想法。
目录
相关文章
|
3天前
|
Java API Apache
Java编程如何读取Word文档里的Excel表格,并在保存文本内容时保留表格的样式?
【10月更文挑战第29天】Java编程如何读取Word文档里的Excel表格,并在保存文本内容时保留表格的样式?
17 5
|
11天前
|
设计模式 安全 Java
Java编程中的单例模式深入剖析
【10月更文挑战第21天】在Java的世界里,单例模式是设计模式中一个常见而又强大的存在。它确保了一个类只有一个实例,并提供一个全局访问点。本文将深入探讨如何正确实现单例模式,包括常见的实现方式、优缺点分析以及最佳实践,同时也会通过实际代码示例来加深理解。无论你是Java新手还是资深开发者,这篇文章都将为你提供宝贵的见解和技巧。
90 65
|
11天前
|
Java 调度
[Java]线程生命周期与线程通信
本文详细探讨了线程生命周期与线程通信。文章首先分析了线程的五个基本状态及其转换过程,结合JDK1.8版本的特点进行了深入讲解。接着,通过多个实例介绍了线程通信的几种实现方式,包括使用`volatile`关键字、`Object`类的`wait()`和`notify()`方法、`CountDownLatch`、`ReentrantLock`结合`Condition`以及`LockSupport`等工具。全文旨在帮助读者理解线程管理的核心概念和技术细节。
27 1
[Java]线程生命周期与线程通信
|
2天前
|
Java 开发者
在Java多线程编程的世界里,Lock接口正逐渐成为高手们的首选,取代了传统的synchronized关键字
在Java多线程编程的世界里,Lock接口正逐渐成为高手们的首选,取代了传统的synchronized关键字
12 4
|
2天前
|
消息中间件 供应链 Java
掌握Java多线程编程的艺术
【10月更文挑战第29天】 在当今软件开发领域,多线程编程已成为提升应用性能和响应速度的关键手段之一。本文旨在深入探讨Java多线程编程的核心技术、常见问题以及最佳实践,通过实际案例分析,帮助读者理解并掌握如何在Java应用中高效地使用多线程。不同于常规的技术总结,本文将结合作者多年的实践经验,以故事化的方式讲述多线程编程的魅力与挑战,旨在为读者提供一种全新的学习视角。
20 3
|
3天前
|
安全 Java 调度
Java中的多线程编程入门
【10月更文挑战第29天】在Java的世界中,多线程就像是一场精心编排的交响乐。每个线程都是乐团中的一个乐手,他们各自演奏着自己的部分,却又和谐地共同完成整场演出。本文将带你走进Java多线程的世界,让你从零基础到能够编写基本的多线程程序。
12 1
|
7天前
|
缓存 Java 调度
Java中的多线程编程:从基础到实践
【10月更文挑战第24天】 本文旨在为读者提供一个关于Java多线程编程的全面指南。我们将从多线程的基本概念开始,逐步深入到Java中实现多线程的方法,包括继承Thread类、实现Runnable接口以及使用Executor框架。此外,我们还将探讨多线程编程中的常见问题和最佳实践,帮助读者在实际项目中更好地应用多线程技术。
15 3
|
9天前
|
监控 安全 Java
Java多线程编程的艺术与实践
【10月更文挑战第22天】 在现代软件开发中,多线程编程是一项不可或缺的技能。本文将深入探讨Java多线程编程的核心概念、常见问题以及最佳实践,帮助开发者掌握这一强大的工具。我们将从基础概念入手,逐步深入到高级主题,包括线程的创建与管理、同步机制、线程池的使用等。通过实际案例分析,本文旨在提供一种系统化的学习方法,使读者能够在实际项目中灵活运用多线程技术。
|
10天前
|
存储 安全 Java
Java编程中的对象序列化与反序列化
【10月更文挑战第22天】在Java的世界里,对象序列化和反序列化是数据持久化和网络传输的关键技术。本文将带你了解如何在Java中实现对象的序列化与反序列化,并探讨其背后的原理。通过实际代码示例,我们将一步步展示如何将复杂数据结构转换为字节流,以及如何将这些字节流还原为Java对象。文章还将讨论在使用序列化时应注意的安全性问题,以确保你的应用程序既高效又安全。
|
7天前
|
缓存 安全 Java
Java中的多线程编程:从基础到实践
【10月更文挑战第24天】 本文将深入探讨Java中的多线程编程,包括其基本原理、实现方式以及常见问题。我们将从简单的线程创建开始,逐步深入了解线程的生命周期、同步机制、并发工具类等高级主题。通过实际案例和代码示例,帮助读者掌握多线程编程的核心概念和技术,提高程序的性能和可靠性。
10 2