黑马程序员--网络编程
2014-06-05 11:28
162 查看
协议:规定了通信双方应该怎样通信。
HTTP-----应用层协议
TCP
IP
UDP
SMTP
POP3
---------------------
TCP
HTTP协议是基于TCP协议上开发。
要求必须有请求,服务器得到请求进行响应,才可以进行通信。
UDP
丢包协议。
UDP
将数据及源和目的封装成数据包中,不需要建立连接
每个数据报的大小在限制在64k内
因无连接,是不可靠协议
不需要建立连接,速度快
TCP
建立连接,形成传输数据的通道。
在连接中进行大数据量传输
通过三次握手完成连接,是可靠协议
必须建立连接,效率会稍低
网络开发三要素:(重点)
1.协议
规定双方如果通信
2.IP地址
IP地址是唯一的,它唯一定位主机。
3.端口号
用来定义IP地址指向这台主机的某一个应用程序。
常用端口号:
http协议: 80
SMTP 20 21
POP3 110
tomcat 8080
mysql 3306
oracle 1521
sqlserver 1433
端口号 65536个 0-65535 对于前1024不推荐使用。
BS结构 Broswer server 浏览器服务器
CS结构 Client Server 客户端服务器
基于TCP下网络开发
java.net包下.
InetAddress它代表的就是IP地址.
InetAddress它的获取:
getByName(String hostname);
参数是主机名 返回的就是一个InetAddress对象.
getLocalHost() 获取本机InetAddress对象.
其它API
getHostName();获取主机名
getHostAddress(); 获取ip地址
- ------------------------------------------------
TCP协议下开发,要求必须请求,响应,在进行通信。
ServerSocket
new ServerSocket(int prot); 在创建服务器时,只需要指定端口就可以。
Socket
就代表一个客户端。
ServerSocket它的accept方法可以接收一个客户端,返回一个Socket对象。它与客户端的Socket是匹配的。通过
Socket就可以实现通信.
Socket提供
getInputStream();
getOutputStream();
InetAddress:构造方法私有,不能直接创建对象。
InetAddress getByName(String host):在给定主机名的情况下确定主机的ip地址。
InetAddress getLocalHost():返回本地主机。
InetAddress[] getAllByName(String host)
ip.getHostAddress(),
ip.getHostName()
[java]
view plaincopyprint?
package demo;
import java.net.InetAddress;
public class Demo1 {
public static void main(String[] args) throws Exception {
InetAddress i = InetAddress.getLocalHost();
System.out.println(i);
i = InetAddress.getByName("www.XXX.com");
System.out.println(i);
System.out.println(i.getHostAddress());
System.out.println(i.getHostName());
}
}
输出: 输出 被屏蔽.........
Socket
Socket就是为网络服务提供的一种机制。
通信的两端都有Socket。
网络通信其实就是Socket间的通信。
数据在两个Socket间通过IO传输。
UDP传输
1:只要是网络传输,必须有socket 。
2:数据一定要封装到数据包中,数据包中包括目的地址、端口、数据等信息。
直接操作udp不可能,对于java语言应该将udp封装成对象,易于我们的使用,这个对象就是DatagramSocket. 封装了udp传输协议的socket对象。
因为数据包中包含的信息较多,为了操作这些信息方便,也一样会将其封装成对象。这个数据包对象就是:DatagramPacket.通过这个对象中的方法,就可以获取到数据包中的各种信息。
DatagramSocket具备发送和接受功能,在进行udp传输时,需要明确一个是发送端,一个是接收端。
udp的发送端:
1:建立udp的socket服务,创建对象时如果没有明确端口,系统会自动分配一个未被使用的端口。
2:明确要发送的具体数据。
3:将数据封装成了数据包。
4:用socket服务的send方法将数据包发送出去。
5:关闭资源。
udp的接收端:
1:创建udp的socket服务,必须要明确一个端口,作用在于,只有发送到这个端口的数据才是这个接收端可以处理的数据。
2:定义数据包,用于存储接收到数据。
3:通过socket服务的接收方法将收到的数据存储到数据包中。
4:通过数据包的方法获取数据包中的具体数据内容,比如ip、端口、数据等等。
5:关闭资源。
发送端(客户端)
[java]
view plaincopyprint?
import java.net.*;
class UdpSend{
public static void main(String[] args)throws Exception {
// 1,建立udp的socket服务。
DatagramSocket ds = new DatagramSocket(8888);//指定发送端口,这个可以不指定,系统会随机分配。
// 2,明确要发送的具体数据。
String text = "udp传输演示 哥们来了";
byte[] buf = text.getBytes();
// 3,将数据封装成了数据包。
DatagramPacket dp = new DatagramPacket(buf,buf.length,InetAddress.getByName("10.1.31.127"),10000);
// 4,用socket服务的send方法将数据包发送出去。
ds.send(dp);
// 5,关闭资源。
ds.close();
}
}
[java]
view plaincopyprint?
//接收端(服务器端)
import java.net.*;
class UdpRece {
public static void main(String[] args) throws Exception{
// 1,创建udp的socket服务。
DatagramSocket ds = new DatagramSocket(10000);//必须指定,并且和上面的端口号一样!
// 2,定义数据包,用于存储接收到数据。先定义字节数组,数据包会把数据存储到字节数组中。
byte[] buf = new byte[1024];
DatagramPacket dp = new DatagramPacket(buf,buf.length);
// 3,通过socket服务的接收方法将收到的数据存储到数据包中。
ds.receive(dp);//该方法是阻塞式方法。
// 4,通过数据包的方法获取数据包中的具体数据内容,比如ip,端口,数据等等。
String ip = dp.getAddress().getHostAddress();
int port = dp.getPort();
String text = new String(dp.getData(),0,dp.getLength());//将字节数组中的有效部分转成字符串。
System.out.println(ip+":"+port+"--"+text);
// 5,关闭资源。
ds.close();
}
}
TCP传输
两个端点的建立连接后会有一个传输数据的通道,这通道称为流,而且是建立在网络基础上的流,称之为socket流。该流中既有读取,也有写入。
tcp的两个端点:一个是客户端,一个是服务端。
客户端:对应的对象,Socket
服务端:对应的对象,ServerSocket
TCP客户端:
1:建立tcp的socket服务,最好明确具体的地址和端口。这个对象在创建时,就已经可以对指定ip和端口进行连接(三次握手)。
2:如果连接成功,就意味着通道建立了,socket流就已经产生了。只要获取到socket流中的读取流和写入流即可,只要通过getInputStream和getOutputStream就可以获取两个流对象。
3:关闭资源。
[java]
view plaincopyprint?
import java.net.*;
import java.io.*;
//需求:客户端给服务器端发送一个数据。
class TcpClient{
public static void main(String[] args) throws Exception{
Socket s = new Socket("10.1.31.69",10002);
OutputStream out = s.getOutputStream();//获取了socket流中的输出流对象。
out.write("tcp演示,哥们又来了!".getBytes());
s.close();
}
}
练习示例:
[java]
view plaincopyprint?
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
//客户端
public class ClientFrameTest extends JFrame implements Runnable,
ActionListener {
DataInputStream dis = null;
DataOutputStream dos = null;
// 声明出界面上所要使用的组件.
JTextArea area = new JTextArea(16, 30);
JScrollPane jsp = new JScrollPane(area);
JTextField txt = new JTextField(24);
JButton btn = new JButton("发送");
JPanel panel = new JPanel();
public ClientFrameTest() {
super("客户端");
btn.addActionListener(this);
txt.addActionListener(this);
area.setEditable(false); // 文本域不可编辑
area.setLineWrap(true);
panel.add(jsp);
panel.add(txt);
panel.add(btn);
this.getContentPane().add(panel);
this.setBounds(100, 100, 400, 400);
this.setDefaultCloseOperation(3);
this.setVisible(true);
this.initClient();
new Thread(this).start();
}
// 初始化客户端
public void initClient() {
// 创建客户端,并向服务器发送请求
Socket client;
try {
client = new Socket("localhost", 9999);
// 通过socket获取输入输出流,完成通信
// 客户端读取服务器发送的信息. 输入流
dis = new DataInputStream(client.getInputStream());
// 客户端向服务器发送信息. 输出流
dos = new DataOutputStream(client.getOutputStream());
} catch (UnknownHostException e) {
System.out.println("找不到服务器");
} catch (IOException e) {
System.out.println("链接服务器失败");
}
}
// 读操作
public void readMsg() throws IOException {
String msg = dis.readUTF();
area.append("server:" + msg + "\n");
}
// 写操作
public void writeMsg(String msg) {
// System.out.println("请输入要发送到服务器端的信息:");
try {
dos.writeUTF(msg);
dos.flush();
} catch (IOException e) {
e.printStackTrace();
}
area.append("client:" + msg + "\n");
}
// 子线程 不停的读取信息
public void run() {
while (true) {
try {
this.readMsg();
} catch (IOException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) throws UnknownHostException,
IOException {
<span style="white-space:pre"> </span>ClientFrameTest cd3 = new ClientFrameTest();
}
public void actionPerformed(ActionEvent e) {
// 得到文本框中的信息,调用输出方法,将信息输出
String msg = txt.getText();
this.writeMsg(msg);
txt.setText("");
}
}
[java]
view plaincopyprint?
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
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;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
//服务器
public class ServerFrameTest extends JFrame implements Runnable,
ActionListener {
DataOutputStream dos = null;
DataInputStream dis = null;
BufferedReader br = null;
// 声明出界面上所要使用的组件.
JTextArea area = new JTextArea(16, 30);
JScrollPane jsp = new JScrollPane(area);
JTextField txt = new JTextField(24);
JButton btn = new JButton("发送");
JPanel panel = new JPanel();
public ServerFrameTest() {
super("服务器端");
btn.addActionListener(this);
txt.addActionListener(this);
area.setEditable(false); // 文本域不可编辑
area.setLineWrap(true);
<span style="white-space:pre"> </span> panel.add(jsp);
panel.add(txt);
panel.add(btn);
this.getContentPane().add(panel);
this.setBounds(100, 100, 400, 400);
this.setDefaultCloseOperation(3);
this.setVisible(true);
this.initServer();
new Thread(this).start();
}
// 服务器初始化
public void initServer() {
// 创建服务器
ServerSocket server;
try {
server = new ServerSocket(9999);
// 接收一个客户端的请求
Socket socket = server.accept();
// 服务器向客户端发送信息 输出流.
dos = new DataOutputStream(socket.getOutputStream());
// 定义一个可以从键盘接收数据的流.
// br = new BufferedReader(new InputStreamReader(System.in));
// 服务器读取客户端发送的信息 输入流
dis = new DataInputStream(socket.getInputStream());
} catch (IOException e) {
System.out.println("服务器创建失败");
}
}
// 读操作
public void readMsg() throws IOException {
String msg = dis.readUTF();
// 将读到的信息显示在文本域中
area.append("client:" + msg + "\n");
}
// 写操作
public void writeMsg(String msg) {
try {
dos.writeUTF(msg);
dos.flush();
} catch (IOException e) {
e.printStackTrace();
}
area.append("server:" + msg + "\n");
}
// 子线程 不停的读取信息
public void run() {
while (true) {
try {
this.readMsg();
} catch (IOException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) throws IOException {
ServerFrameTest sd3 = new ServerFrameTest();
}
public void actionPerformed(ActionEvent e) {
// 得到文本框中的信息,调用输出方法,将信息输出
String msg = txt.getText();
this.writeMsg(msg);
txt.setText("");
}
}
HTTP-----应用层协议
TCP
IP
UDP
SMTP
POP3
---------------------
TCP
HTTP协议是基于TCP协议上开发。
要求必须有请求,服务器得到请求进行响应,才可以进行通信。
UDP
丢包协议。
UDP
将数据及源和目的封装成数据包中,不需要建立连接
每个数据报的大小在限制在64k内
因无连接,是不可靠协议
不需要建立连接,速度快
TCP
建立连接,形成传输数据的通道。
在连接中进行大数据量传输
通过三次握手完成连接,是可靠协议
必须建立连接,效率会稍低
网络开发三要素:(重点)
1.协议
规定双方如果通信
2.IP地址
IP地址是唯一的,它唯一定位主机。
3.端口号
用来定义IP地址指向这台主机的某一个应用程序。
常用端口号:
http协议: 80
SMTP 20 21
POP3 110
tomcat 8080
mysql 3306
oracle 1521
sqlserver 1433
端口号 65536个 0-65535 对于前1024不推荐使用。
BS结构 Broswer server 浏览器服务器
CS结构 Client Server 客户端服务器
基于TCP下网络开发
java.net包下.
InetAddress它代表的就是IP地址.
InetAddress它的获取:
getByName(String hostname);
参数是主机名 返回的就是一个InetAddress对象.
getLocalHost() 获取本机InetAddress对象.
其它API
getHostName();获取主机名
getHostAddress(); 获取ip地址
- ------------------------------------------------
TCP协议下开发,要求必须请求,响应,在进行通信。
ServerSocket
new ServerSocket(int prot); 在创建服务器时,只需要指定端口就可以。
Socket
就代表一个客户端。
ServerSocket它的accept方法可以接收一个客户端,返回一个Socket对象。它与客户端的Socket是匹配的。通过
Socket就可以实现通信.
Socket提供
getInputStream();
getOutputStream();
InetAddress:构造方法私有,不能直接创建对象。
InetAddress getByName(String host):在给定主机名的情况下确定主机的ip地址。
InetAddress getLocalHost():返回本地主机。
InetAddress[] getAllByName(String host)
ip.getHostAddress(),
ip.getHostName()
[java]
view plaincopyprint?
package demo;
import java.net.InetAddress;
public class Demo1 {
public static void main(String[] args) throws Exception {
InetAddress i = InetAddress.getLocalHost();
System.out.println(i);
i = InetAddress.getByName("www.XXX.com");
System.out.println(i);
System.out.println(i.getHostAddress());
System.out.println(i.getHostName());
}
}
package demo; import java.net.InetAddress; public class Demo1 { public static void main(String[] args) throws Exception { InetAddress i = InetAddress.getLocalHost(); System.out.println(i); i = InetAddress.getByName("www.XXX.com"); System.out.println(i); System.out.println(i.getHostAddress()); System.out.println(i.getHostName()); } }
输出: 输出 被屏蔽.........
Socket
Socket就是为网络服务提供的一种机制。
通信的两端都有Socket。
网络通信其实就是Socket间的通信。
数据在两个Socket间通过IO传输。
UDP传输
1:只要是网络传输,必须有socket 。
2:数据一定要封装到数据包中,数据包中包括目的地址、端口、数据等信息。
直接操作udp不可能,对于java语言应该将udp封装成对象,易于我们的使用,这个对象就是DatagramSocket. 封装了udp传输协议的socket对象。
因为数据包中包含的信息较多,为了操作这些信息方便,也一样会将其封装成对象。这个数据包对象就是:DatagramPacket.通过这个对象中的方法,就可以获取到数据包中的各种信息。
DatagramSocket具备发送和接受功能,在进行udp传输时,需要明确一个是发送端,一个是接收端。
udp的发送端:
1:建立udp的socket服务,创建对象时如果没有明确端口,系统会自动分配一个未被使用的端口。
2:明确要发送的具体数据。
3:将数据封装成了数据包。
4:用socket服务的send方法将数据包发送出去。
5:关闭资源。
udp的接收端:
1:创建udp的socket服务,必须要明确一个端口,作用在于,只有发送到这个端口的数据才是这个接收端可以处理的数据。
2:定义数据包,用于存储接收到数据。
3:通过socket服务的接收方法将收到的数据存储到数据包中。
4:通过数据包的方法获取数据包中的具体数据内容,比如ip、端口、数据等等。
5:关闭资源。
发送端(客户端)
[java]
view plaincopyprint?
import java.net.*;
class UdpSend{
public static void main(String[] args)throws Exception {
// 1,建立udp的socket服务。
DatagramSocket ds = new DatagramSocket(8888);//指定发送端口,这个可以不指定,系统会随机分配。
// 2,明确要发送的具体数据。
String text = "udp传输演示 哥们来了";
byte[] buf = text.getBytes();
// 3,将数据封装成了数据包。
DatagramPacket dp = new DatagramPacket(buf,buf.length,InetAddress.getByName("10.1.31.127"),10000);
// 4,用socket服务的send方法将数据包发送出去。
ds.send(dp);
// 5,关闭资源。
ds.close();
}
}
import java.net.*; class UdpSend{ public static void main(String[] args)throws Exception { // 1,建立udp的socket服务。 DatagramSocket ds = new DatagramSocket(8888);//指定发送端口,这个可以不指定,系统会随机分配。 // 2,明确要发送的具体数据。 String text = "udp传输演示 哥们来了"; byte[] buf = text.getBytes(); // 3,将数据封装成了数据包。 DatagramPacket dp = new DatagramPacket(buf,buf.length,InetAddress.getByName("10.1.31.127"),10000); // 4,用socket服务的send方法将数据包发送出去。 ds.send(dp); // 5,关闭资源。 ds.close(); } }
[java]
view plaincopyprint?
//接收端(服务器端)
import java.net.*;
class UdpRece {
public static void main(String[] args) throws Exception{
// 1,创建udp的socket服务。
DatagramSocket ds = new DatagramSocket(10000);//必须指定,并且和上面的端口号一样!
// 2,定义数据包,用于存储接收到数据。先定义字节数组,数据包会把数据存储到字节数组中。
byte[] buf = new byte[1024];
DatagramPacket dp = new DatagramPacket(buf,buf.length);
// 3,通过socket服务的接收方法将收到的数据存储到数据包中。
ds.receive(dp);//该方法是阻塞式方法。
// 4,通过数据包的方法获取数据包中的具体数据内容,比如ip,端口,数据等等。
String ip = dp.getAddress().getHostAddress();
int port = dp.getPort();
String text = new String(dp.getData(),0,dp.getLength());//将字节数组中的有效部分转成字符串。
System.out.println(ip+":"+port+"--"+text);
// 5,关闭资源。
ds.close();
}
}
//接收端(服务器端) import java.net.*; class UdpRece { public static void main(String[] args) throws Exception{ // 1,创建udp的socket服务。 DatagramSocket ds = new DatagramSocket(10000);//必须指定,并且和上面的端口号一样! // 2,定义数据包,用于存储接收到数据。先定义字节数组,数据包会把数据存储到字节数组中。 byte[] buf = new byte[1024]; DatagramPacket dp = new DatagramPacket(buf,buf.length); // 3,通过socket服务的接收方法将收到的数据存储到数据包中。 ds.receive(dp);//该方法是阻塞式方法。 // 4,通过数据包的方法获取数据包中的具体数据内容,比如ip,端口,数据等等。 String ip = dp.getAddress().getHostAddress(); int port = dp.getPort(); String text = new String(dp.getData(),0,dp.getLength());//将字节数组中的有效部分转成字符串。 System.out.println(ip+":"+port+"--"+text); // 5,关闭资源。 ds.close(); } }
TCP传输
两个端点的建立连接后会有一个传输数据的通道,这通道称为流,而且是建立在网络基础上的流,称之为socket流。该流中既有读取,也有写入。
tcp的两个端点:一个是客户端,一个是服务端。
客户端:对应的对象,Socket
服务端:对应的对象,ServerSocket
TCP客户端:
1:建立tcp的socket服务,最好明确具体的地址和端口。这个对象在创建时,就已经可以对指定ip和端口进行连接(三次握手)。
2:如果连接成功,就意味着通道建立了,socket流就已经产生了。只要获取到socket流中的读取流和写入流即可,只要通过getInputStream和getOutputStream就可以获取两个流对象。
3:关闭资源。
[java]
view plaincopyprint?
import java.net.*;
import java.io.*;
//需求:客户端给服务器端发送一个数据。
class TcpClient{
public static void main(String[] args) throws Exception{
Socket s = new Socket("10.1.31.69",10002);
OutputStream out = s.getOutputStream();//获取了socket流中的输出流对象。
out.write("tcp演示,哥们又来了!".getBytes());
s.close();
}
}
import java.net.*; import java.io.*; //需求:客户端给服务器端发送一个数据。 class TcpClient{ public static void main(String[] args) throws Exception{ Socket s = new Socket("10.1.31.69",10002); OutputStream out = s.getOutputStream();//获取了socket流中的输出流对象。 out.write("tcp演示,哥们又来了!".getBytes()); s.close(); } }
练习示例:
[java]
view plaincopyprint?
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
//客户端
public class ClientFrameTest extends JFrame implements Runnable,
ActionListener {
DataInputStream dis = null;
DataOutputStream dos = null;
// 声明出界面上所要使用的组件.
JTextArea area = new JTextArea(16, 30);
JScrollPane jsp = new JScrollPane(area);
JTextField txt = new JTextField(24);
JButton btn = new JButton("发送");
JPanel panel = new JPanel();
public ClientFrameTest() {
super("客户端");
btn.addActionListener(this);
txt.addActionListener(this);
area.setEditable(false); // 文本域不可编辑
area.setLineWrap(true);
panel.add(jsp);
panel.add(txt);
panel.add(btn);
this.getContentPane().add(panel);
this.setBounds(100, 100, 400, 400);
this.setDefaultCloseOperation(3);
this.setVisible(true);
this.initClient();
new Thread(this).start();
}
// 初始化客户端
public void initClient() {
// 创建客户端,并向服务器发送请求
Socket client;
try {
client = new Socket("localhost", 9999);
// 通过socket获取输入输出流,完成通信
// 客户端读取服务器发送的信息. 输入流
dis = new DataInputStream(client.getInputStream());
// 客户端向服务器发送信息. 输出流
dos = new DataOutputStream(client.getOutputStream());
} catch (UnknownHostException e) {
System.out.println("找不到服务器");
} catch (IOException e) {
System.out.println("链接服务器失败");
}
}
// 读操作
public void readMsg() throws IOException {
String msg = dis.readUTF();
area.append("server:" + msg + "\n");
}
// 写操作
public void writeMsg(String msg) {
// System.out.println("请输入要发送到服务器端的信息:");
try {
dos.writeUTF(msg);
dos.flush();
} catch (IOException e) {
e.printStackTrace();
}
area.append("client:" + msg + "\n");
}
// 子线程 不停的读取信息
public void run() {
while (true) {
try {
this.readMsg();
} catch (IOException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) throws UnknownHostException,
IOException {
<span style="white-space:pre"> </span>ClientFrameTest cd3 = new ClientFrameTest();
}
public void actionPerformed(ActionEvent e) {
// 得到文本框中的信息,调用输出方法,将信息输出
String msg = txt.getText();
this.writeMsg(msg);
txt.setText("");
}
}
import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import java.net.Socket; import java.net.UnknownHostException; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTextArea; import javax.swing.JTextField; //客户端 public class ClientFrameTest extends JFrame implements Runnable, ActionListener { DataInputStream dis = null; DataOutputStream dos = null; // 声明出界面上所要使用的组件. JTextArea area = new JTextArea(16, 30); JScrollPane jsp = new JScrollPane(area); JTextField txt = new JTextField(24); JButton btn = new JButton("发送"); JPanel panel = new JPanel(); public ClientFrameTest() { super("客户端"); btn.addActionListener(this); txt.addActionListener(this); area.setEditable(false); // 文本域不可编辑 area.setLineWrap(true); panel.add(jsp); panel.add(txt); panel.add(btn); this.getContentPane().add(panel); this.setBounds(100, 100, 400, 400); this.setDefaultCloseOperation(3); this.setVisible(true); this.initClient(); new Thread(this).start(); } // 初始化客户端 public void initClient() { // 创建客户端,并向服务器发送请求 Socket client; try { client = new Socket("localhost", 9999); // 通过socket获取输入输出流,完成通信 // 客户端读取服务器发送的信息. 输入流 dis = new DataInputStream(client.getInputStream()); // 客户端向服务器发送信息. 输出流 dos = new DataOutputStream(client.getOutputStream()); } catch (UnknownHostException e) { System.out.println("找不到服务器"); } catch (IOException e) { System.out.println("链接服务器失败"); } } // 读操作 public void readMsg() throws IOException { String msg = dis.readUTF(); area.append("server:" + msg + "\n"); } // 写操作 public void writeMsg(String msg) { // System.out.println("请输入要发送到服务器端的信息:"); try { dos.writeUTF(msg); dos.flush(); } catch (IOException e) { e.printStackTrace(); } area.append("client:" + msg + "\n"); } // 子线程 不停的读取信息 public void run() { while (true) { try { this.readMsg(); } catch (IOException e) { e.printStackTrace(); } } } public static void main(String[] args) throws UnknownHostException, IOException { <span style="white-space:pre"> </span>ClientFrameTest cd3 = new ClientFrameTest(); } public void actionPerformed(ActionEvent e) { // 得到文本框中的信息,调用输出方法,将信息输出 String msg = txt.getText(); this.writeMsg(msg); txt.setText(""); } }
[java]
view plaincopyprint?
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
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;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
//服务器
public class ServerFrameTest extends JFrame implements Runnable,
ActionListener {
DataOutputStream dos = null;
DataInputStream dis = null;
BufferedReader br = null;
// 声明出界面上所要使用的组件.
JTextArea area = new JTextArea(16, 30);
JScrollPane jsp = new JScrollPane(area);
JTextField txt = new JTextField(24);
JButton btn = new JButton("发送");
JPanel panel = new JPanel();
public ServerFrameTest() {
super("服务器端");
btn.addActionListener(this);
txt.addActionListener(this);
area.setEditable(false); // 文本域不可编辑
area.setLineWrap(true);
<span style="white-space:pre"> </span> panel.add(jsp);
panel.add(txt);
panel.add(btn);
this.getContentPane().add(panel);
this.setBounds(100, 100, 400, 400);
this.setDefaultCloseOperation(3);
this.setVisible(true);
this.initServer();
new Thread(this).start();
}
// 服务器初始化
public void initServer() {
// 创建服务器
ServerSocket server;
try {
server = new ServerSocket(9999);
// 接收一个客户端的请求
Socket socket = server.accept();
// 服务器向客户端发送信息 输出流.
dos = new DataOutputStream(socket.getOutputStream());
// 定义一个可以从键盘接收数据的流.
// br = new BufferedReader(new InputStreamReader(System.in));
// 服务器读取客户端发送的信息 输入流
dis = new DataInputStream(socket.getInputStream());
} catch (IOException e) {
System.out.println("服务器创建失败");
}
}
// 读操作
public void readMsg() throws IOException {
String msg = dis.readUTF();
// 将读到的信息显示在文本域中
area.append("client:" + msg + "\n");
}
// 写操作
public void writeMsg(String msg) {
try {
dos.writeUTF(msg);
dos.flush();
} catch (IOException e) {
e.printStackTrace();
}
area.append("server:" + msg + "\n");
}
// 子线程 不停的读取信息
public void run() {
while (true) {
try {
this.readMsg();
} catch (IOException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) throws IOException {
ServerFrameTest sd3 = new ServerFrameTest();
}
public void actionPerformed(ActionEvent e) {
// 得到文本框中的信息,调用输出方法,将信息输出
String msg = txt.getText();
this.writeMsg(msg);
txt.setText("");
}
}
相关文章推荐
- 黑马程序员-Java网络编程学习总结
- 黑马程序员-java网络编程
- 黑马程序员-----网络编程学习日志
- 黑马程序员——网络编程
- 黑马程序员——Java网络编程
- 黑马程序员--网络编程的基础知识
- 黑马程序员_关于网络编程的学习
- 黑马程序员:网络编程
- 黑马程序员--网络通信UDP编程的总结及部分知识点查询
- 黑马程序员Java培训和Android培训_网络编程
- 【黑马程序员】网络编程
- 黑马程序员_网络编程
- 黑马程序员_Java 网络编程
- 黑马程序员_Java基础第24天_Java网络编程续
- 黑马程序员 (6)JAVA网络编程部分
- 黑马程序员之网络编程
- 黑马程序员_网络编程
- 黑马程序员-网络编程
- 黑马程序员_网络编程
- 黑马程序员-java-网络编程