java 网络编程

前言:
学习java 网络编程预备知识 [url=http://software.intel.com/zh-cn/blogs/2012/12/18/java-socket-socket/?cid=sw:prccsdn23019]socket[/url]、数据流、线程。
前两个都很容易解决,线程这块要下点功夫,还好java对这块有天生的优势。
学socket 之前要看一下tcp/udp 传输层协议,理解起来会有帮助,学数据流之前看一下 装饰模式 会对你成长大有裨益,学习线程之前还是先买本书吧。呵呵。
废话不说了,简单的例子,以激发自己学习兴趣:

import java.io.IOException;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;

/**
* 运行方法: 运行此类后,打开浏览器,地址栏中输入“http://127.0.0.1:8888”就可以看到效果!
*
* @author Administrator
*/
public class WebServer {

public static void main(String[] args) {
try {
ServerSocket ss = new ServerSocket(8888);
while (true) {
Socket s = ss.accept();
Service sc = new Service(s);
Thread th = new Thread(sc);
th.start();
}
} catch (IOException e) {
e.printStackTrace();
}
}

}

/**
*
* 提供多线程服务
* @author Administrator
*
*/
class Service implements Runnable {
private Socket socket = null;

public Service(Socket s) {
this.socket = s;//new 对象时传递 Socket 对象
}

@Override
public void run() {
try {
PrintWriter pw = new PrintWriter(socket.getOutputStream());
pw.println("HTTP/1.0 200 OK");//封装http协议头
pw.println("Content-Type:text/html;charset=utf-8");//继续封装协议头
pw.println();
pw.println("<h1>Test Web Server Success!</h1>");//内容
pw.flush();
pw.close();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}

}


怎么样?
是不是感觉咱们一直用的tomcat 你也会写了?呵呵,继续努力吧,说不定下一代高性能服务器软件由你开发!


------------------
服务器端:NetServer.java

package com.leson.net;

import java.io.DataInputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

public class NetServer {

/**
* 主线程。提供服务。
* @param args
*/
public static void main(String[] args) {
NetServer ns = new NetServer();
ns.doListen();
}

/**
* 监听客户端socket发来的数据
*/
public void doListen() {
try {
ServerSocket ss = new ServerSocket(12345);
while (true) {
Socket s = ss.accept();
new Thread(new Service(s)).start();
}
} catch (IOException e) {
System.out.println("doListen() throw error!");
e.printStackTrace();
}
}
}

/**
* 实现多线程。
* @author Administrator
*
*/
class Service implements Runnable {
private Socket socket = null;
public Service(Socket socket) {
this.socket = socket;// 函数构造时,初始化属性。
}

/**
* 逻辑代码,处理每个线程socket 的数据。
*/
@Override
public void run() {
DataInputStream dis = null;
try {
dis = new DataInputStream(socket.getInputStream());
byte[] bytes = new byte[1024];
int n = dis.read(bytes);
System.out.println(new String(bytes, 0, n));
} catch (IOException e1) {
System.out.println("run() throw error!");
e1.printStackTrace();
}
}

}


客户端:NetClient.java

package com.leson.net;

import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;

public class NetClient {

/**
* 发送数据
*/
public static void sendData(String sendStr) {
DataOutputStream dos = null;
Socket s = null;
try {
s = new Socket("127.0.0.1", 12345);
dos = new DataOutputStream(s.getOutputStream());
dos.write(sendStr.getBytes());
dos.close();
s.close();
} catch (IOException e) {
e.printStackTrace();
}
}

/**
* @param args
*/
public static void main(String[] args) {
sendData("abcd|123456|张三李四手顶替");
}

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值