两个在各自局域网的用户,分别用各自的路由器代理上网。他们间的单独通讯可以用点对点的方式。比方说QQ,我知道这样方式可以用UDP方式实现。不知道能不能用TCP方式实现。就是说,在一个局域网内的机器上开了一个ServerSocket,另外一个用户能不能用Socket访问到这个ServerSocket.
解决方案 »
- java1.7.0_09环境变量设置后能显示java 命令但是找不到javac命令
- 编译出错:对于常量池来说,字符串表示的UTF过长,那我想知道,JVM的常量池到底有多大?
- java 数组值比较大小并分类
- 使用Java Applet访问数据库
- 一个小技术细节问题。
- 求大神指点,地址问题
- 请教问题 关于mysql和java
- 没有jre能够运行吗?(100分)
- jbuilder8 enterprise注册码or注册机!!!!谁有啊??有的话帮个忙!谢谢!!
- 哪儿有用javamail详细读邮件的程序(邮件中有附件,有html邮件等情况)
- 麻烦哪位大哥解释一句代码(event),50分
- 有谁写过自动顶帖的JAVA代码?
import java.awt.event.*;
import javax.swing.*;
import java.net.*;
import java.io.IOException;public class ChatDemo extends JFrame {
private JTextField tfIP,tfMessage;
private List display;
DatagramSocket ds = null;
DatagramPacket dp = null;
public ChatDemo(){
super("聊天程序");
//set up GUI
JPanel southPanel= new JPanel();
southPanel.setLayout(new BorderLayout());
tfIP = new JTextField(10);
tfMessage = new JTextField(15);
southPanel.add(tfIP,BorderLayout.WEST);
southPanel.add(tfMessage,BorderLayout.EAST);
display = new List();
//display.setVisibleRowCount(10);
getContentPane().add(display,BorderLayout.CENTER);
getContentPane().add(southPanel,BorderLayout.SOUTH);
try{
ds = new DatagramSocket(3000);
}
catch(SocketException e){
e.printStackTrace();
}
new Thread(
new Runnable(){
public void run(){
byte[] buf = new byte[1024];
DatagramPacket dp = new DatagramPacket(buf,1024);
while(true){
try{
ds.receive(dp);
display.add(new String(buf,0,dp.getLength())+"\n\n From:"+dp.getAddress().getHostAddress()+":"+
dp.getPort());
}
catch(IOException e){
if(!ds.isClosed())
e.printStackTrace();
}
}
}
}
).start();
tfMessage.addActionListener(
new ActionListener(){
public void actionPerformed(ActionEvent event){
try{
dp = new DatagramPacket(tfMessage.getText().getBytes(),tfMessage.getText().getBytes().length,
InetAddress.getByName(tfIP.getText()),3000);
ds.send(dp);
tfMessage.setText("");
}
catch(IOException e){
e.printStackTrace();
}
}
}
);
addWindowListener(
new WindowAdapter(){
public void windowClosing(WindowEvent event){
ds.close();
dispose();
System.exit(0);
}
}
);
setSize(300,400);
setVisible(true);
setResizable(false);
}
public static void main(String[] args){
ChatDemo application = new ChatDemo();
application.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
// TCPimport java.net.*;
import java.io.IOException;
public class TCPServerDemo {
static int count=0;
static boolean bRunning = true;
public static void main(String[] args){
try{
ServerSocket ss = new ServerSocket(8003);
//boolean bRunning = true;
while(bRunning){
Socket s = ss.accept();
if(s!=null)
count++;
new Thread( new Servicer(s)).start();
}
ss.close();
}
catch(IOException e){
e.printStackTrace();
}
}
}//=========================================================import java.net.*;
import java.io.*;public class TCPServer {
public static void main(String[] args){
try{
ServerSocket ss = new ServerSocket(8003);
Socket s = ss.accept();
InputStream ips = s.getInputStream();
OutputStream ops = s.getOutputStream();
ops.write("Hello World".getBytes());
BufferedReader bf = new BufferedReader(new InputStreamReader(ips));
System.out.println(bf.readLine());
bf.close();
ops.close();
s.close();
ss.close();
}
catch(IOException e)
{
e.printStackTrace();
}
}
}
//===========================================================import java.net.*;
import java.io.*;public class Servicer implements Runnable {
private Socket s;
public Servicer(Socket s){
this.s = s;
}
public void run(){
try{
InputStream ips = s.getInputStream();
OutputStream ops = s.getOutputStream();
BufferedReader br = new BufferedReader( new InputStreamReader(ips));
PrintWriter pw = new PrintWriter(ops,true);
while(true){
String strLine = br.readLine();
if(strLine.equalsIgnoreCase("quit")){
TCPServerDemo.count--;
if(TCPServerDemo.count==0)
TCPServerDemo.bRunning = false;
break;
}
System.out.println(strLine+"From"+s.getInetAddress().toString()+":"+s.getPort());
String strEcho = (new StringBuffer(strLine).reverse()).toString();
pw.println(strLine +"------>"+strEcho);
}
br.close();
pw.close();
s.close();
}
catch(IOException e){
e.printStackTrace();
}
}
}