网络编程的定义
使用代码来完成,两个或者多个应用程序,之间的通过某种协议进行数据传递,这就是网络编程。
4、开发一个服务端和一个客户端的程序,让后让客户端来链接服务端,并且进行数据传输。
5、基于Socket 完成一个网络编程实例.
a、创建服务端(ServerSocket(创建端口)), 创建一个客户端(Socket,必须指明要链接服务端ip,和port(端口))
b、服务端要给客户端发送一个信息,客户端要接受服务端发送过来的信息,
客户端还要给服务端发送信息,服务端也得接受客户端发送的信息。
c、能不能就这样不断发送信息?
d、服务能不能给多个客户端发送信息?能不能监听到多个客户端?
6、服务负责接受任何一个客户端发送来信息,并且把发送来的信息分发给每个客户端。
7、作业:指定给谁发信息。
gh.li@hyserver.com
使用代码来完成,两个或者多个应用程序,之间的通过某种协议进行数据传递,这就是网络编程。
4、开发一个服务端和一个客户端的程序,让后让客户端来链接服务端,并且进行数据传输。
5、基于Socket 完成一个网络编程实例.
a、创建服务端(ServerSocket(创建端口)), 创建一个客户端(Socket,必须指明要链接服务端ip,和port(端口))
b、服务端要给客户端发送一个信息,客户端要接受服务端发送过来的信息,
客户端还要给服务端发送信息,服务端也得接受客户端发送的信息。
c、能不能就这样不断发送信息?
d、服务能不能给多个客户端发送信息?能不能监听到多个客户端?
6、服务负责接受任何一个客户端发送来信息,并且把发送来的信息分发给每个客户端。
7、作业:指定给谁发信息。
gh.li@hyserver.com
客户端代码
package com.salmon.test;
import java.awt.BorderLayout;
import java.awt.Frame;
import java.awt.TextArea;
import java.awt.TextField;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class TestClient extends Frame{
// 客户端链接对象
Socket s = null;
// 创建输出流 负责窗口给 服务端发送信息
DataOutputStream dos;
// 声明单行的文本框 组件
TextField tf;
// 多行文本框组件
TextArea ta;
public void init(){
// 设置位置
this.setLocation(0, 0);
// 设置大小
this.setSize(400,300);
// 设置当前窗口的大小
//this.setBounds(0, 0, 400, 300);
// 创建组件
tf = new TextField();
ta = new TextArea();
// 把创建好的组件 放在我们当前窗口中
this.add(ta,BorderLayout.NORTH);
this.add(tf,BorderLayout.SOUTH);
// 给窗口添加一个关闭的时间
this.addWindowListener(new WindowAdapter() {
// 这个就会在你 点击窗口 那个红色叉号 就会调用这个方法 就去把当前的程序结束
@Override
public void windowClosing(WindowEvent arg0) {
// 退出程序
System.exit(0);
}
});
// 给单行文本框添加回车触发事件
tf.addActionListener(new ActionListener() {
/**
* 在你按 回车的时候 就调用这个方法
*/
@Override
public void actionPerformed(ActionEvent arg0) {
// 获得单行输入框中值
String msg = tf.getText();
Date today = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
String time = sdf.format(today);
msg = time+":\n"+msg;
// 先把信息发送给服务端
try {
dos.writeUTF(msg);
dos.flush();
} catch (IOException e) {
e.printStackTrace();
}
/*// 把放在 多行文本框中
if("".equals(ta.getText())){
ta.setText(msg);
}else{
ta.setText(ta.getText()+"\n"+msg);
}*/
tf.setText("");
}
});
// 调用创建链接 方法
this.createConn();
// 启动一个线程负责 接收服务端发送过来信息
ServerThread st = new ServerThread(s,ta);
st.start();
// 窗口随着内容大小而呈现(自适应)
this.pack();
/*// 让窗口中组件重新布局
this.validate();
// 让窗口显示
this.show();*/
// 显示窗口
this.setVisible(true);
}
/**
* 创建和服务器的链接
*/
public void createConn(){
try {
s = new Socket("localhost",8000);
// 获得一个 输出流对象
dos =new DataOutputStream(s.getOutputStream());
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String args[]){
new TestClient().init();
}
}
// 一个文件 两个类
class ServerThread extends Thread{
Socket s;
DataInputStream dis;
TextArea ta;
public ServerThread(Socket s,TextArea ta){
this.ta = ta;
this.s = s;
try {
dis = new DataInputStream(s.getInputStream());
} catch (IOException e) {
e.printStackTrace();
}
}
public void run(){
try {
while (true) {
String msg = dis.readUTF();
if("".equals(ta.getText())){
ta.setText(msg);
}else{
ta.setText(ta.getText()+"\n"+msg);
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
服务端代码
package com.salmon.test;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;
public class TestServer {
boolean flag = true;
List list = new ArrayList();
public void init(){
try {
// 创建服务端对象
ServerSocket ss = new ServerSocket(8000);//1-1023 系统中就已经占用了
while(flag){
// 启动服务的监听 去监听有没有客户端 链接
Socket s = ss.accept();
System.out.println("成功监听到一个客户端的链接.....");
// 就创建一个 线程对象 来封装这个客户端对象
ClientThread ct = new ClientThread(s,list);
ct.setName(s.getPort()+"");
// 装到一个容器中
list.add(ct);
// 启动线程
ct.start();
}
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
new TestServer().init();
}
}
// 一个源文件 两个类
class ClientThread extends Thread{
List list;
Socket s;
DataInputStream dis;
DataOutputStream dos;
public ClientThread(Socket s,List list){
this.list = list;
this.s = s;
try {
dis = new DataInputStream(s.getInputStream());
dos = new DataOutputStream(s.getOutputStream());
} catch (IOException e) {
e.printStackTrace();
}
}
public void run(){
// 接受信息 并且把接受信息发送给所有人
while(true){
try {
String msg = dis.readUTF();
for (int i = 0; i < list.size(); i++) {
ClientThread ct = (ClientThread)list.get(i);
ct.dos.writeUTF(this.getName()+"--"+msg);
ct.dos.flush();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}