四十二,Java网络编程浅析

coding

1.网络编程的基本概念

网络编程使物理上不在一起的主机进行互联,网络连接过程需要使用网络协议,常见的通信协议是TCP,UDP协议.

  • TCP:属于可靠的连接,使用三方握手的方式完成连接的确认.

  • UDP:属于不可靠的连接.

对于网络的开发有两种架构:C/SB/S.

2.简单TCP程序实现

网络开发包所在的类都在java.net开发包中.此包中可以使用ServerSocket,Socket类完成服务器和客户端的开发.开发TCP程序,首先开发服务器端,使用ServerSocket进行客户端的连接接收,每个客户端在程序上都使用Socket对象表示.

Server代码:

package com.ares.demo.helloserver;

import java.io.OutputStream;

import java.io.PrintStream;

import java.net.ServerSocket;

import java.net.Socket;

public class HelloServer {

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

ServerSocket server = new ServerSocket(8888); // 在8888端口上开启服务

Socket client = null; // 表示连接的客户端

System.out.println("等待客户端连接... ...");

client = server.accept(); // 接受客户端的连接

OutputStream out = client.getOutputStream(); // 得到客户端的输出流

PrintStream pout = new PrintStream(out);

pout.println("hello world!!!");

pout.close();

out.close();

client.close();

server.close();

}

}


Client代码示例:

package com.ares.demo.helloserver;

import java.io.BufferedReader;

import java.io.InputStreamReader;

import java.net.Socket;

public class HelloClient {

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

Socket client = new Socket("localhost", 8888);// 表示连接的主机及端口

BufferedReader buf = null;

buf = new BufferedReader(new InputStreamReader(client.getInputStream()));

String str = buf.readLine();// 接收回应的内容

System.out.println("内容是:" + str);

client.close();

}

}



3.echo程序实现

Sever代码示例:

package com.ares.demo.echoserver;

import java.io.BufferedReader;

import java.io.InputStreamReader;

import java.io.PrintStream;

import java.net.ServerSocket;

import java.net.Socket;

public class EchoServer {

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

ServerSocket server = new ServerSocket(8888); // 在8888端口上开启服务

Socket client = null; // 表示连接的客户端

boolean flag = true;

while (flag) {

System.out.println("等待客户端连接... ...");

client = server.accept(); // 接受客户端的连接

BufferedReader buf = new BufferedReader(new InputStreamReader(

client.getInputStream()));

PrintStream pout = new PrintStream(client.getOutputStream());

// 得到客户端的输出流

boolean temp = true;

while (temp) {// 循环接收用户输入的内容并回应

String str = buf.readLine();

if (str == null || "".equals(str)) {

temp = false;

break;

}

if ("bye".equals(str)) {

temp = false;

break;

}

pout.println("ECHO:" + str); // 回送信息

}

pout.close();

client.close();

}

server.close();

}

}


Client代码示例:

package com.ares.demo.echoserver;

import java.io.BufferedReader;

import java.io.InputStreamReader;

import java.io.PrintStream;

import java.net.Socket;

public class EchoClient {

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

Socket client = new Socket("localhost", 8888);// 表示连接的主机及端口

BufferedReader input = new BufferedReader(new InputStreamReader(

System.in));

BufferedReader buf = null;

buf = new BufferedReader(new InputStreamReader(client.getInputStream()));

PrintStream out = new PrintStream(client.getOutputStream());

boolean flag = true;

while (flag) {

System.out.print("请输入要发送的内容:") ;

String str = input.readLine();// 接收回应的内容

if (str == null || "".equals(str)) {

flag = false;

break;

}

if ("bye".equals(str)) {

flag = false;

break;

}

out.println(str) ;

System.out.println(buf.readLine()) ;

}

client.close();

}

}


该代码只适合单线程的连接访问.可以进一步优化.


4.多线程的echo程序

Server代码示例:

EchoThread代码

package com.ares.demo.echothreadserver;

import java.io.BufferedReader;

import java.io.InputStreamReader;

import java.io.PrintStream;

import java.net.Socket;

public class EchoThread implements Runnable {

private Socket client;

public EchoThread(Socket client) {

this.client = client;

}

public void run() {

try {

BufferedReader buf = new BufferedReader(new InputStreamReader(

client.getInputStream()));

PrintStream pout = new PrintStream(client.getOutputStream());

// 得到客户端的输出流

boolean temp = true;

while (temp) {// 循环接收用户输入的内容并回应

String str = buf.readLine();

if (str == null || "".equals(str)) {

temp = false;

break;

}

if ("bye".equals(str)) {

temp = false;

break;

}

pout.println("ECHO:" + str); // 回送信息

}

pout.close();

client.close();

} catch (Exception e) {

}

}

}


EchoServer代码

package com.ares.demo.echothreadserver;

import java.net.ServerSocket;

public class EchoServer {

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

ServerSocket server = new ServerSocket(8888); // 在8888端口上开启服务

boolean flag = true;

while (flag) {

System.out.println("等待客户端连接... ...");

new Thread(new EchoThread(server.accept())).start() ;

}

server.close();

}

}

:此程序即实现了多线程的访问

.



5.UDP程序实现

UDP的程序使用数据报的形式出现,需要使用到以下两个类:

  • 数据报的内容: DatagramPacket

  • 发送和接收数据报: DatagramSocket

客户端代码:

package com.ares.demo.udpdemo;

import java.net.DatagramPacket;

import java.net.DatagramSocket;

import java.net.InetAddress;

public class UDPSend {

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

DatagramSocket socket = new DatagramSocket(9000);

// 服务器端在9000端口等待接收服务器发来的信息

String str = "hello world!!!";

DatagramPacket pack = new DatagramPacket(str.getBytes(), 0, str

.length(), InetAddress.getLocalHost(), 3000);// 开辟1024的空间

//3000端口是服务器的端口

socket.send(pack);

}

}


服务器端代码:

package com.ares.demo.udpdemo;

import java.net.DatagramPacket;

import java.net.DatagramSocket;

public class UDPReceive {

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

DatagramSocket socket = new DatagramSocket(3000);

// 客户端在3000端口等待接收服务器发来的信息

DatagramPacket pack = new DatagramPacket(new byte[1024], 1024);

// 开辟1024的空间

socket.receive(pack);

System.out.println("接收到的内容是:" + new String(pack.getData())) ;

}

}






20150529


JAVA学习笔记系列

--------------------------------------------

                    联系方式

--------------------------------------------

        Weibo: ARESXIONG

        E-Mail: aresxdy@gmail.com

------------------------------------------------






以上是 四十二,Java网络编程浅析 的全部内容, 来源链接: utcz.com/z/509705.html

回到顶部