Java 网络编程--------------------基于TCP/IP(加入多线程)

1、服务器类:

package com.serversocket;

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class Server_02 {
	//定义保存所有Socket的ArrayList,并将其包装为线程安全的
	public static List<Socket> socketList = Collections.synchronizedList(new ArrayList<>());

	public static void main(String[] args) throws IOException {

		ServerSocket ss = new ServerSocket(30000);

		while(true){
			//此行代码会阻塞,会一直等待别人的链接
			Socket s = ss.accept();
			socketList.add(s);
			//每当客户端连接成功后启动一个ServerThread线程为该客户端服务
			new Thread(new ServerThread02(s)).start();
		}
	}
}

2、服务器线程类

package com.serversocket;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.Socket;

public class ServerThread02 implements Runnable {

	//定义当前线程处理的Socket
	Socket s = null;
	//该线程所处理的Socket的输入流
	BufferedReader br = null;

	public ServerThread02(Socket s) throws IOException {
		this.s = s;
		//初始化该Socket所对应的输入流
		br = new BufferedReader(new InputStreamReader(s.getInputStream()));
	}

	public void run() {
		try {
			String content = null;
			//采用循环不断的从Socket中读取客户端发送过来的数据
			while ((content = readFromClient()) != null) {
				//遍历socketList中的每个Socket
				//将读到的内容向每个Socket发送一次
				for (Socket s : Server_02.socketList) {
					PrintStream ps = new PrintStream(s.getOutputStream());
					ps.println(content);
				}
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	//定义读取客户端数据的方法
	private String readFromClient() {
		try { 
			return br.readLine();
			//如果捕获到异常,则表明Socket对应的客户端已经关闭
		} catch (IOException e) {
			//删除该Socket
			Server_02.socketList.remove(s);
		}
		return null;
	}
}

3、客户端类

package com.socket;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.Socket;

public class Client_02 {

	public static void main(String[] args) throws Exception {

		Socket s = new Socket("127.0.0.1",30000);

		//客户端启动ClientThread02不断的读取来自服务器的数据

		new Thread(new ClientThread02(s)).start();

		PrintStream ps = new PrintStream(s.getOutputStream());

		String line = null;
		System.out.println("请输入消息:");
		//不断读取键盘的输入
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

		while((line = br.readLine())!=null){
			//将用户的键盘输入内容写入Socket对应的输出流
			ps.println(line);
		}
	}
}

4、客户端线程类

package com.socket;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;

public class ClientThread02 implements Runnable {
	//该线程负责处理的Socket
	private Socket s = null;
	//该线程处理的Socket对应的输入流
	BufferedReader br = null;

	public ClientThread02(Socket s) throws IOException{
		this.s = s;
		br = new BufferedReader(new InputStreamReader(s.getInputStream()));
	}

	@Override
	public void run() {

		try{
			String content = null;
			//不断读取Socket输入流中的内容,并将这些内容打印输出
			while((content=br.readLine()) != null){
				System.out.println(content);
			}
		}catch(IOException e){
			e.printStackTrace();
		}
	}
}

编写好上面代码之后,首先启动服务器类,然后再启动客户端类(可以启动多个客户端类)

时间: 2024-07-29 06:02:19

Java 网络编程--------------------基于TCP/IP(加入多线程)的相关文章

Java网络编程(tcp在服务器上应用多线程)

package org.tcp; import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.PrintStream; import java.net.Socket; public class EchoThread implements Runnable { private Socket client = null; public EchoThread(Socket client){ this.c

Java网络编程 - 基于UDP协议 实现简单的聊天室程序

最近比较闲,一直在抽空回顾一些Java方面的技术应用. 今天没什么事做,基于UDP协议,写了一个非常简单的聊天室程序. 现在的工作,很少用到socket,也算是对Java网络编程方面的一个简单回忆. 先看一下效果: 实现的效果可以说是非常非常简单,但还是可以简单的看到一个实现原理. "聊天室001"的用户,小红和小绿相互聊了两句,"聊天室002"的小黑无人理会,在一旁寂寞着. 看一下代码实现: 1.首先是消息服务器的实现,功能很简单: 将客户端的信息(进入了哪一个聊

【网络编程】TCP/IP协议

Transmission Control Protocol/Internet Protocol的简写,中译名为传输控制协议/因特网互联协议,又名网络通讯协议,是Internet最基本的协议.Internet国际互联网络的基 础,由网络层的IP协议和传输层的TCP协议组成.TCP/IP 定义了电子设备如何连入因特网,以及数据如何在它们之间传输的标准.协议采用了4层的层级结构,每一层都呼叫它的下一层所提供的协议来完成自己的需求.通 俗而言:TCP负责发现传输的问题,一有问题就发出信号,要求重新传输,

java 网络编程(Socket) TCP/UDP 总结案例

网络编程:关注的是底层的数据传输 网页编程:数据的展示 1.基本概念 一.网络:将不同的计算机连接在一起局域网 城域网 互联网 二.地址:Ip地址确定网络上的绝对的地址位置   房子的地址 三.端口号(相当于房门):区分计算机上的软件 相当于房门两个字节0~65535 共65536个 1. 同一个协议下,端口号不能重复,不同的协议下可以重复 2. 1024以下的端口不要使用 80-->http 21-->ftp 四.资源定位 URL 统一资源定位 URI:统一资源 五.数据的传输 1. 协议:

网络编程——基于TCP协议的Socket编程,基于UDP协议的Socket编程

Socket编程 目前较为流行的网络编程模型是客户机/服务器通信模式 客户进程向服务器进程发出要求某种服务的请求,服务器进程响应该请求.如图所示,通常,一个服务器进程会同时为多个客户端进程服务,图中服务器进程B1同时为客户进程A1.A2和B2提供服务. Socket概述 ①   所谓Socket通常也称作“套接字”,用于描述IP地址和端口,是一个通信链的句柄.应用程序通常通过“套接字”向网络发出请求或者应答网络请求. ②   Socket是连接运行在网络上的两个程序间的双向通信的端点. ③  

Java Socket实现基于TCP和UDP多线程通信

一.通过Socket实现TCP编程 1.1 TCP编程 TCP协议是面向连接,可靠的,有序的,以字节流的方式发送数据.基于TCP协议实现网络通信的类有客户端的Socket类和服务器端的ServerSocket类. 1.2 服务器端套路 1.创建ServerSocket对象,绑定监听端口. 2.通过accept()方法监听客户端请求. 3.连接建立后,通过输入流读取客户端发送的请求信息. 4.通过输出流向客户端发送响应信息. 5.关闭响应的资源. 1.3 客户端套路 1.创建Socket对象,指明

java 网络编程 UDP TCP

网络编程 网络编程主要用于解决计算机与计算机(手机.平板..)之间的数据传输问题. 网络编程: 不需要基于html页面就可以达到数据之间的传输. 比如: feiQ , QQ , 微信....网页编程: 就是要基于html页面的基础上进行数据的交互的. 比如: 珍爱网. oa(办公自动化). 高考的报告系统... 计算机网络: 分布在不同地域 的计算机通过外部设备链接起来达到了消息互通.资源共享的效果就称作为一个计算机网络.网络通讯的三要素:    1. IP    2. 端口号.    3. 协

2015/12/14 Python网络编程,TCP/IP客户端和服务器初探

一直不是很清楚服务器的定义,对于什么是服务器/客户端架构也只有一个模糊的感觉.最近开始学习,才明白一些什么服务器和客户端的关系. 所谓的服务器,就是提供服务的东西,它是一个硬件或者软件,可以向一个或者多个客户端提供所需要的服务.它存在的目的就是等待客户的请求,然后给客户服务,再接着等待请求. 而客户端,就来连上一个服务器,提出自己的请求,然后等待获得反馈. 比如说,打印机就是一个服务器的例子,与之相连的计算机就是客户端,通过网络连接打印机后,给它提出服务需求(打印)和传输数据(传输内容),然后打

linux网络编程 基于TCP的程序开发

面向连接的TCP程序设计 基于TCP的程序开发分为服务器端和客户端两部分,常见的核心步骤和流程: 其实按照上面这个流程调用系统API确实可以完全实现应用层程序的开发,一点问题没有.可随着时间的推移,你会觉得这样子的开发毫无激情.为什么TCP的开发就要按照这样的流程来呢?而且一般出的问题几乎都不在这几个系统调用上,原因何在?当我们弄清网络开发的本质,协议栈的设计原理.数据流向等这些问题的答案也就会慢慢浮出水面了.接下来这几篇博文主要是围绕网络编程展开,目的是引出后面对于Linux下TCP/IP协议