新手一枚,Java学习中,把自己学习网络编程的知识总结一下,梳理下知识,方便日后查阅,高手莫进。

本文的主要内容:

[1]    网络编程认识              

 [2]  TCP/IP编程小例子

[3]   UDP编程小例子

[4]  简单线程池实例

一、网络编程的主要认识

Java是一种基于网络设计的语言,用于开发网络软件特别便利。

它对于网络的操作都是基于IP层以上的,也就是对TCP/UDP进行操作,所以java的网络编程又称为Socket编程。

  一种是TCP/IP 网络编程,

  一种是UDP编程。

TCPTranfer Control Protocol的 简称,是一种面向连接的保证可靠传输的协议。通过TCP协议传输,得到的是一个顺序的无差错的数据流。发送方和接收方的成对的两个socket之间必须建 立连接,以便在TCP协议的基础上进行通信,当一个socket(通常都是server socket)等待建立连接时,另一个socket可以要求进行连接,一旦这两个socket连接起来,它们就可以进行双向数据传输,双方都可以进行发送 或接收操作。

UDPUser Datagram Protocol的简称,是一种无连接的协议,每个数据报都是一个独立的信息,包括完整的源地址或目的地址,它在网络上以任何可能的路径传往目的地,因此能否到达目的地,到达目的地的时间以及内容的正确性都是不能被保证的。

另外,网络编程不同于WEB编程。

此处只把我自己学习时写的两个小例子贴出来。

关于Java网络编程更详细的介绍,感觉一些前辈总结的不错,贴出地址,各位如有需要,可以自己查阅。

http://www.cnblogs.com/springcsc/archive/2009/12/03/1616413.html

二、 TCP/IP编程

服务端代码:

 import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket; public class Server {
public static void main(String[] args) throws IOException {
ServerSocket server = new ServerSocket(8888);// 实例化一个ServerSocket对象那个,用于监视服务器的
// 8888 端口
Socket socket = server.accept();// 调用access()阻塞方法,等待客户端发送数据过来
// 设置输入缓冲流,把键盘输入的数据保存在流中
BufferedReader input = new BufferedReader(new InputStreamReader(System.in));
// 用两个数据流来读取和输出ServerSocket对象server的接收数据和发送数据
DataOutputStream write = new DataOutputStream(socket.getOutputStream());
DataInputStream read = new DataInputStream(socket.getInputStream());
// 阻塞方法,接收数据
String line = read.readUTF(); while (line != "bye") {
// 输出接受的数据
System.out.println(socket.getInetAddress() + " : " + socket.getPort() + " say:" + line);
// 阻塞方法,接收用户键盘输入的数据,用于发送给客户端
line = input.readLine();
System.out.println("server say:" + line);
// 服务器发送数据
write.writeUTF(line);
line = read.readUTF();
}
// 关闭流和ServerSocket
read.close();
write.close();
input.close();
socket.close();
server.close();
}
}

Client 端代码

 import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException; public class Client {
public static void main(String[] args) throws IOException {
BufferedReader inputStream = null;
DataInputStream reader = null;
DataOutputStream writer = null;
Socket socket = null;
String line = null;
// 实例化Socket 用于指定所要发送数据的目标地址为127.0.0.1。端口为8888
socket = new Socket("127.0.0.1", 8888); inputStream = new BufferedReader(new InputStreamReader(System.in));
reader = new DataInputStream(socket.getInputStream());
writer = new DataOutputStream(socket.getOutputStream()); line = inputStream.readLine(); while (line != "bye") {
System.out.println("client say: " + line);
writer.writeUTF(line);
line = reader.readUTF();
System.out.println("server say: " + line);
line = inputStream.readLine();
}
inputStream.close();
reader.close();
writer.close();
socket.close(); }
}

三、UDP编程

服务端代码:

 import java.io.ByteArrayInputStream;
import java.io.DataInputStream;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket; public class UDPServer {
public static void main(String[] args) throws IOException {
// 定义缓冲区大小
byte[] buff = new byte[1024];
// 实例化一个DatagramPacket对象,用于接受消息
DatagramPacket packet = new DatagramPacket(buff, buff.length);
DatagramSocket socket = new DatagramSocket(8888);
while (true) {
// 阻塞方法
socket.receive(packet);
ByteArrayInputStream bais = new ByteArrayInputStream(buff, 0, packet.getLength());
DataInputStream stream = new DataInputStream(bais);
long l = stream.readLong();
System.out.println(l);
}
}
}

Client端代码:

 import java.io.ByteArrayOutputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress; public class UDPClient {
public static void main(String[] args) throws IOException {
// 发送long类型数据
long n = 100000L;
ByteArrayOutputStream baos = new ByteArrayOutputStream();
DataOutputStream outputStream = new DataOutputStream(baos);
outputStream.writeLong(n);
byte[] buff = baos.toByteArray();
DatagramPacket packet = new DatagramPacket(buff, buff.length, new InetSocketAddress("127.0.0.1", 8888));
DatagramSocket socket = new DatagramSocket(9999);
socket.send(packet);
socket.close();
}
}

四、简单的线程池代码:

 import java.util.LinkedList;

 public class TestThreadPool {
public static void main(String[] args) {
int numThreads = 3;
MyThreadPool pool = new MyThreadPool(numThreads);
int numTasks = 10;
for (int i = 0; i < numTasks; i++) {
pool.performTask(new MyTask(i));
}
pool.join();
} } // 线程池类,继承自ThreadGroup
class MyThreadPool extends ThreadGroup {
private boolean isAlive;// 表示线程池是否可以使用
private LinkedList taskQueue;// 工作队列
private int threadId;// 线程池内线程id
private static int threadPoolId;// 线程池id,可以实例化多个线程池 public MyThreadPool(int numThreads)
{
super("threadPoolID" + (threadPoolId++));
super.setDaemon(true);
this.isAlive = true;
// 初始化工作队列
this.taskQueue = new LinkedList();
for (int i = 0; i < numThreads; i++) {
// PooledThread是处理工作的线程类
new PooledThread().start();
}
} /** 添加新任务 */
public synchronized void performTask(Task task) {
if (!this.isAlive) {
throw new IllegalStateException();
}
if (task != null) {
this.taskQueue.add(task);
notify();
}
} /**
* 获取任务
* @throws InterruptedException
*/
protected synchronized Task getTask() throws InterruptedException {
while (this.taskQueue.size() == 0) {
if (!this.isAlive)
return null;
this.wait();
}
return (Task) this.taskQueue.removeFirst();
} /** 关闭线程池,所有线程停止,不再执行 */
public synchronized void close() {
if (this.isAlive) {
this.isAlive = false;
this.taskQueue.clear();
this.interrupt();
}
} /** 关闭线程池,并等待线程池中所有任务运行完成,不能接受新任务 */
public void join() {
synchronized (this) {
isAlive = false;
notifyAll();
}
Thread[] threads = new Thread[this.activeCount()];
int count = this.enumerate(threads);
for (int i = 0; i < count; i++) {
try {
threads[i].join();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
} // 内部类,用于执行任务的工作线程
class PooledThread extends Thread {
public PooledThread()
{
super(MyThreadPool.this, "PooledThread" + (threadId++));
} public void run() {
while (!Thread.interrupted()) {
// 获取任务
Task task = null;
try {
task = getTask();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if (task == null)
return;
try {
task.perform();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
} }
}
} } // 定义任务的接口类
interface Task {
/**
* 执行任务 执行过程中可能出现异常
*/
public void perform() throws Exception;
} // 实现上面接口的任务类
class MyTask implements Task {
private int TaskId = 0; public MyTask(int id)
{
this.TaskId = id;
} @Override
public void perform() throws Exception {
System.out.println("MyTask " + TaskId + " Start");
Thread.sleep(1000);
System.out.println("MyTask " + TaskId + " end");
} }

最后,无论是TCP/IP 编程,还是UDP编程,都只是同步的,就用到的是阻塞方法,当服务器或者客户端没有发送来数据时,就一直处于等待状态。

最新的JDK已经推出了异步编程相关内容,我还有学习过,以后继续努力。

Java 网络编程学习总结的更多相关文章

  1. Java网络编程学习A轮_01_目标与基础复习

    A. A轮目标 复习网络编程基础知识,重点学习下TCP三次握手四次挥手,以及可能引发的异常情况. 回顾 Socket 编程,好多年没写(chao)过相关代码了. 重学 NIO,以前学的基本忘光了,毕竟 ...

  2. Java网络编程学习笔记

    Java网络编程,我们先来看下面这一张图: 由图可得:想要进行网络编程,首先是服务器端通过ServerSocket对某一个端口进行监听.通过accept来判断是否有客户端与其相连.若成功连上,则通过r ...

  3. java网络编程学习笔记(一)

    1.进程之间的通信 进程是指运行中的程序,进程的任务就是执行程序中的代码. 存在计算机网络上的两个进程只需要关注它们通信的具体内容,而不需关注消息在网络上传输的具体细节. 2.计算机网络的概念 Int ...

  4. Java网络编程学习A轮_06_NIO入门

    参考资料: 老外写的教程,很适合入门:http://tutorials.jenkov.com/java-nio/index.html 上面教程的译文:http://ifeve.com/overview ...

  5. Java网络编程学习

    服务器是指提供信息的计算机或程序,客户机是指请求信息的计算机或程序,而网络用于连接服务器与客户机,实现两者相互通信.但有时在某个网络中很难将服务器与客户机区分开.我们通常所说的“局域网”(Local ...

  6. java网络编程学习之NIO模型

    网上对NIO的解释有很多,但自己一直没有理解,根据自己的理解画出下面这个图,有什么不对的地方,欢迎留言指出. 理解是,客户端先与通过通道Channel与连接(注册到服务器端),然后再传送数据,服务器端 ...

  7. Java网络编程学习A轮_08_NIO的Reactor模型

    参考资料: 了解 Java NIO 的 Reactor 模型,大神 Doug Lea 的 PPT Scalable IO in Java 必看:http://gee.cs.oswego.edu/dl/ ...

  8. Java网络编程学习A轮_07_基于Buffer的Socket编程

    示例代码: https://github.com/gordonklg/study,socket module A. LineSeparate 基于 Buffer 实现逐行读取的 EchoServer ...

  9. Java网络编程学习A轮_05_Socket编程

    示例代码: https://github.com/gordonklg/study,socket module A. Socket 编程简单例子 最简单的 Socket 编程是通过回车/换行符,整行读取 ...

随机推荐

  1. ajax请求成功后新窗口window.open()被拦截的解决方法

    ajax 异步请求成功后需要新开窗口打开 url,使用的是 window.open() 方法,但是该操作并不是用户主动触发的,所以它认为这是不安全的就拦截了(不过如果是 _self 的话就不会有这个限 ...

  2. TweenMax学习一

    TweenMaxjs是一个性能很高的js动画框架,它与css3动画具有时间轴的概念.你可以很方便的把动画添加到一个时间轴队列里面去按照你需要的顺序去执行. 官网地址: http://greensock ...

  3. 远程连接服务器for Linux

    远程连接Linux云服务器-命令行模式 1.远程连接工具.目前Linux远程连接工具有很多种,您可以选择顺手的工具使用.下面使用的是名为Putty的Linux远程连接工具.该工具是免费的,且不需要安装 ...

  4. 在centos6.7用yum安装redis解决办法

    1. centos默认的安装源在官方centos.org上,而Redis在第三方的yum源里,所以无法安装,非官方的yum推荐用fedora的epel仓库 [root@localhost instal ...

  5. SQL Server 不清空数据,修改数据库字段、结构,阻止保存要求重新创建表的更改

    当数据库有数据修改数据库字段时,默认是阻止的! 工具---选项---设计器---阻止保存要求重新创建表的更改(取消钩)

  6. margin属性

    可以设置position:absolute/relative/fixed,通过调节top/bottom/left/right实现元素的定位,这样很好,但是有时候想通过margin来实现. 下面是mar ...

  7. ubuntu16.04部署RED5流媒体服务器

    前提:jdk已经安装 1,下载RED5(https://github.com/Red5/red5-server/releases)选择red5-server-X.X.X-MXX.tar.gz 2,解压 ...

  8. windows---------------windows如何查看哪个应用占用了哪个端口的方法

    假如我们需要确定谁占用了我们的80端口在windows命令行窗口下执行:netstat -aon|findstr "80"TCP 127.0.0.1:80 0.0.0.0:0 LI ...

  9. 实验三——for语句及分支结构else-if

    1.本节课学习到的知识点: (1)for语句是循环语句,它可以实现c语句的重复执行 (2)for语句中的3个表达式的执行顺序和书写顺序不同 (3)遇到复合语句时要用大括号将几句话括起来,复合语句在语法 ...

  10. 夺命雷公狗-----React_native---4---初始化项目

    我们首先在android目录下创建一个apps的文件夹: 然后我们在apps目录下,按住shift键加鼠标右键选择--在此打开命令窗口输入命令初始化项目 然后就是等了................. ...